题目:http://uoj.ac/contest/47/problem/454

第一次做通信题,看了半天才搞懂是什么意思。

考虑把字符串拆成三段,每段长度为$\frac{2}{3}n$

对于B:

统计每段中有多少个需要知道的下标,然后让A全文发送下标最多的一段,这里只要发送两个字符告知A应该发送哪一段即可

然后遍历剩下的两段,如果当前下标是需要知道的,就发送1,否则就发送0,这里需要发送$\frac{4}{3}n$个字符

所以对于B,最多只要发送$\frac{4}{3}n + 2$个字符

对于A:

先读入两个字符,然后全文发送B需要的那一段

同样遍历剩下的两段,如果读到的B发送过来的信息是1,则发送当前文字,如果是0则不输出任何字符

首先最多的那一段,它至少包含了$\frac{1}{2}n$个下标,所以在剩下的两段中,我们最多只需发送$\frac{1}{2}n$次即可

总的发送次数就是$\frac{1}{2}n + \frac{2}{3}n$

题目并不难,但这是一道通信题,要注意一些操作细节,具体见代码:

A:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int n, m;
 5 char s[2010];
 6 string cur;
 7
 8 inline char Putchar(char c)
 9 {
10     putchar(c);
11     fflush(stdout);
12 }
13
14 void init()
15 {
16     ifstream fin("alice.in");
17     fin >> n >> m >> (s + 1);
18 }
19
20 int main()
21 {
22     ifstream fin("alice.in");
23     fin >> n >> m >> (s + 1);
24     cur.push_back(getchar()), cur.push_back(getchar());
25     if(cur == "00")
26     {
27         for(int i = 1; i <= 666; ++i) Putchar(s[i]);
28         for(int i = 667; i <= 2000; ++i)
29         {
30             if(getchar() == '1') Putchar(s[i]);
31             else fflush(stdout);
32         }
33     }
34     else if(cur == "01")
35     {
36         for(int i = 1; i <= 666; ++i)
37         {
38             if(getchar() == '1') Putchar(s[i]);
39             else fflush(stdout);
40         }
41         for(int i = 667; i <= 1332; ++i) Putchar(s[i]);
42         for(int i = 1333; i <= 2000; ++i)
43         {
44             if(getchar() == '1') Putchar(s[i]);
45             else fflush(stdout);
46         }
47     }
48     else
49     {
50         for(int i = 1; i <= 1332; ++i)
51         {
52             if(getchar() == '1') Putchar(s[i]);
53             else fflush(stdout);
54         }
55         for(int i = 1333; i <= 2000; ++i) Putchar(s[i]);
56     }
57     return 0;
58 }

B:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 string ans;
 5 int n, m;
 6 int pos[1010], cnt[2010];
 7
 8 inline char Putchar(char c)
 9 {
10     putchar(c);
11     fflush(stdout);
12 }
13
14 int main()
15 {
16     ifstream fin("bob.in");
17     fin >> n >> m;
18     for(int i = 1; i <= n; ++i)
19     {
20         fin >> pos[i];
21         cnt[pos[i]] = 1;
22     }
23     for(int i = 1; i <= 2000; ++i) cnt[i] += cnt[i - 1];
24     int c1 = cnt[666], c2 = cnt[1332] - cnt[666], c3 = n - cnt[1332];
25     int mx = max(c1, max(c2, c3));
26     memset(cnt, 0, sizeof(cnt));
27     for(int i = 1; i <= n; ++i) cnt[pos[i]] = 1;
28     if(c1 == mx)
29     {
30         Putchar('0'), Putchar('0');
31         for(int i = 1; i <= 666; ++i)
32         {
33             if(cnt[i]) ans.push_back(getchar());
34             else getchar();
35         }
36         for(int i = 667; i <= 2000; ++i)
37         {
38             Putchar('0' + cnt[i]);
39             if(cnt[i]) ans.push_back(getchar());
40         }
41     }
42     else if(c2 == mx)
43     {
44         Putchar('0'), Putchar('1');
45         for(int i = 1; i <= 666; ++i)
46         {
47             Putchar('0' + cnt[i]);
48             if(cnt[i]) ans.push_back(getchar());
49         }
50         for(int i = 667; i <= 1332; ++i)
51         {
52             if(cnt[i]) ans.push_back(getchar());
53             else getchar();
54         }
55         for(int i = 1333; i <= 2000; ++i)
56         {
57             Putchar('0' + cnt[i]);
58             if(cnt[i]) ans.push_back(getchar());
59         }
60     }
61     else
62     {
63         Putchar('1'), Putchar('0');
64         for(int i = 1; i <= 1332; ++i)
65         {
66             Putchar('0' + cnt[i]);
67             if(cnt[i]) ans.push_back(getchar());
68         }
69         for(int i = 1333; i <= 2000; ++i)
70         {
71             if(cnt[i]) ans.push_back(getchar());
72             else getchar();
73         }
74     }
75     ofstream fout("bob.out");
76     fout << ans << endl;
77     return 0;
78 }

转载于:https://www.cnblogs.com/Aegir/p/10165085.html

【UER #8】打雪仗相关推荐

  1. [UOJ#454][UER#8]打雪仗

    xx 转载于:https://www.cnblogs.com/lxzl/p/10324980.html

  2. UOJ#454. 【UER #8】打雪仗

    UOJ#454. [UER #8]打雪仗 http://uoj.ac/problem/454 分析: 好玩的通信题~ 把序列分成三块,\(bob\)先发出这三块中询问点最多的一块给\(alice\). ...

  3. 打雪仗java_【UER #8】打雪仗 - 题目 - Universal Online Judge

    这是一道通信题. UOJ 又来到了新的一年,今年鸽子们不出意外的把比赛鸽到了12月月底.今年鸽子们决定玩点不一样的:它们要来打(tong)雪(xin)仗(ti). 小 $A$ (Alice),小 $ ...

  4. UOJ #454.【UER #8】打雪仗 通信题

    题意 有两个人Alice和Bob,现在Alice有一个长度为2n的01串,Bob有n个位于[1,2n]之间的下标,现在要求Alice和Bob之间传递信息,每次只能发送0或1,要求每人发送次数不超过m, ...

  5. 【JZOJ 杂题选讲】【UER #8】打雪仗

    题目 通信题 A知道一个长为2n的01串,B知道n个位置 AB之间可以互相发送01字符,每个人所发不超m个 让AB互相通信,使B得到n个位置的具体值 n=1000 m=1350 子问题:m=1600 ...

  6. UOJ Easy Round #8 T1 打雪仗 题解

    题目链接: [UER #8]打雪仗 第一次做通信题,写篇\(blog\)加深印象. 首先分析题目,根据数据,最坏情况下\(m\approx \frac23n\) 刚开始时想着把进制压到更高进制输出,不 ...

  7. java我们一起打雪仗_我们一起打雪仗作文

    我们一起打雪仗作文 今天,我听妈妈说要下雪.我心想:太好了,感谢老天爷送我一个这么好的礼物.下午第二节课的时候,我看到窗户外面下起了鹅毛大雪. 下课铃响了,同学们争先恐后的`跑到了操场上.大雪铺天盖地 ...

  8. pytorch微调bert_北大、人大联合开源工具箱UER,3 行代码完美复现BERT、GPT

    本文由AI研习社用户张正投稿,来稿见文末联系方式 作者 | 张正 单位 | 清华大学 编辑 | Camel 现存的预训练模型中没有一种可以完美的适用于所有任务,这也给预训练模型的选择带来困难. 对于这 ...

  9. 【DP】【高精】WZK打雪仗(jzoj 1997)

    WZK打雪仗 jzoj 1997 题目大意: 在一个环上有n*2个点,问有多少种连法可以用n条线连接成n对点 输入样例 5 输出样例 42 解释: 一种可行的方案如下: 数据范围 对于30%数据: n ...

最新文章

  1. java 读取网络图片_每日一学:如何读取网络图片
  2. 安全删除U盘时,遇到提示“无法停止‘通用卷’设备时解决方法
  3. 网站优化:浏览器缓存控制简介及配置策略
  4. php转换编码去掉bom,UTF-8编码怎么去掉BOM头?
  5. js 异步执行_JS Asynchronous — JS 异步编程极简史
  6. 使用Java访问Mysql数据库时出现时区异常的解决方案
  7. day12(html、css)
  8. 力扣题目——350. 两个数组的交集 II
  9. 东北大学22春学期《概率论X》在线平时作业123
  10. 新西兰计算机科学专业排名,2020年新西兰计算机科学专业排名榜
  11. BH_Ghost XP SP3完整装机版 V7.6(金大作品)
  12. ES5 标准对象说明
  13. 我的博客开通啦,以后会记录一位IT女的学习生涯
  14. matlab sim函数和simset函数的用法
  15. 零点城市社交电商 2.1.7.4 独立版 全开源 含前后端VUE文件 全插件
  16. GitLab CI/CD系列教程(一)
  17. 计算机毕业设计Java医用物品管理系统(源码+系统+mysql数据库+lw文档)
  18. 【matlab报错】错误使用 graph.validateEdgeProperties (第 375 行) 边属性必须为表。
  19. 【华为OD机试真题2023B卷 JAVAJS】跳房子II
  20. 热流体动压润滑matlab_slide-bearing 轴承热弹流计算程序,很好用。可以 高端 。 matlab 238万源代码下载- www.pudn.com...

热门文章

  1. 不死神兔c语言20月,不死神兔问题(斐波那契数列)
  2. php树莓派养鱼,树莓派学习11: 将树莓派变成一个Web服务器
  3. mysql获取当月数据_MySQL中获取天、周、月等数据
  4. 在列表前方插入一个数据_Python基础知识详解(三):数据结构篇
  5. 3d饼图 vue_这是我见过最优雅的Vue图片轮播插件——Vue-Awesome-Swiper
  6. mysql的语句分类,查询、子查询及连接查询
  7. 全网最具深度的三次握手、四次挥手讲解,稳进大厂
  8. java线程池队列场景,Java面试题汇总
  9. python【数据结构与算法】最短路算法之FloyedDijkstra
  10. python【力扣LeetCode算法题库】1013-将数组分成和相等的三个部分(贪心)