【UER #8】打雪仗
题目: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】打雪仗相关推荐
- [UOJ#454][UER#8]打雪仗
xx 转载于:https://www.cnblogs.com/lxzl/p/10324980.html
- UOJ#454. 【UER #8】打雪仗
UOJ#454. [UER #8]打雪仗 http://uoj.ac/problem/454 分析: 好玩的通信题~ 把序列分成三块,\(bob\)先发出这三块中询问点最多的一块给\(alice\). ...
- 打雪仗java_【UER #8】打雪仗 - 题目 - Universal Online Judge
这是一道通信题. UOJ 又来到了新的一年,今年鸽子们不出意外的把比赛鸽到了12月月底.今年鸽子们决定玩点不一样的:它们要来打(tong)雪(xin)仗(ti). 小 $A$ (Alice),小 $ ...
- UOJ #454.【UER #8】打雪仗 通信题
题意 有两个人Alice和Bob,现在Alice有一个长度为2n的01串,Bob有n个位于[1,2n]之间的下标,现在要求Alice和Bob之间传递信息,每次只能发送0或1,要求每人发送次数不超过m, ...
- 【JZOJ 杂题选讲】【UER #8】打雪仗
题目 通信题 A知道一个长为2n的01串,B知道n个位置 AB之间可以互相发送01字符,每个人所发不超m个 让AB互相通信,使B得到n个位置的具体值 n=1000 m=1350 子问题:m=1600 ...
- UOJ Easy Round #8 T1 打雪仗 题解
题目链接: [UER #8]打雪仗 第一次做通信题,写篇\(blog\)加深印象. 首先分析题目,根据数据,最坏情况下\(m\approx \frac23n\) 刚开始时想着把进制压到更高进制输出,不 ...
- java我们一起打雪仗_我们一起打雪仗作文
我们一起打雪仗作文 今天,我听妈妈说要下雪.我心想:太好了,感谢老天爷送我一个这么好的礼物.下午第二节课的时候,我看到窗户外面下起了鹅毛大雪. 下课铃响了,同学们争先恐后的`跑到了操场上.大雪铺天盖地 ...
- pytorch微调bert_北大、人大联合开源工具箱UER,3 行代码完美复现BERT、GPT
本文由AI研习社用户张正投稿,来稿见文末联系方式 作者 | 张正 单位 | 清华大学 编辑 | Camel 现存的预训练模型中没有一种可以完美的适用于所有任务,这也给预训练模型的选择带来困难. 对于这 ...
- 【DP】【高精】WZK打雪仗(jzoj 1997)
WZK打雪仗 jzoj 1997 题目大意: 在一个环上有n*2个点,问有多少种连法可以用n条线连接成n对点 输入样例 5 输出样例 42 解释: 一种可行的方案如下: 数据范围 对于30%数据: n ...
最新文章
- java 读取网络图片_每日一学:如何读取网络图片
- 安全删除U盘时,遇到提示“无法停止‘通用卷’设备时解决方法
- 网站优化:浏览器缓存控制简介及配置策略
- php转换编码去掉bom,UTF-8编码怎么去掉BOM头?
- js 异步执行_JS Asynchronous — JS 异步编程极简史
- 使用Java访问Mysql数据库时出现时区异常的解决方案
- day12(html、css)
- 力扣题目——350. 两个数组的交集 II
- 东北大学22春学期《概率论X》在线平时作业123
- 新西兰计算机科学专业排名,2020年新西兰计算机科学专业排名榜
- BH_Ghost XP SP3完整装机版 V7.6(金大作品)
- ES5 标准对象说明
- 我的博客开通啦,以后会记录一位IT女的学习生涯
- matlab sim函数和simset函数的用法
- 零点城市社交电商 2.1.7.4 独立版 全开源 含前后端VUE文件 全插件
- GitLab CI/CD系列教程(一)
- 计算机毕业设计Java医用物品管理系统(源码+系统+mysql数据库+lw文档)
- 【matlab报错】错误使用 graph.validateEdgeProperties (第 375 行) 边属性必须为表。
- 【华为OD机试真题2023B卷 JAVAJS】跳房子II
- 热流体动压润滑matlab_slide-bearing 轴承热弹流计算程序,很好用。可以 高端 。 matlab 238万源代码下载- www.pudn.com...
热门文章
- 不死神兔c语言20月,不死神兔问题(斐波那契数列)
- php树莓派养鱼,树莓派学习11: 将树莓派变成一个Web服务器
- mysql获取当月数据_MySQL中获取天、周、月等数据
- 在列表前方插入一个数据_Python基础知识详解(三):数据结构篇
- 3d饼图 vue_这是我见过最优雅的Vue图片轮播插件——Vue-Awesome-Swiper
- mysql的语句分类,查询、子查询及连接查询
- 全网最具深度的三次握手、四次挥手讲解,稳进大厂
- java线程池队列场景,Java面试题汇总
- python【数据结构与算法】最短路算法之FloyedDijkstra
- python【力扣LeetCode算法题库】1013-将数组分成和相等的三个部分(贪心)