题意

有两个人Alice和Bob,现在Alice有一个长度为2n的01串,Bob有n个位于[1,2n]之间的下标,现在要求Alice和Bob之间传递信息,每次只能发送0或1,要求每人发送次数不超过m,且Bob能知道这n个下标对应的字符是什么。
n=1000,m=2000或1600或1350。

分析

m=2000当然就是Alice直接把整个串发过去啦。
考虑这样一种做法,设Bob的长度为2n的01串表示每个位置是否是n个下标中的一个。然后Bob把他的串分成两半,再把1的个数较小的那一半发给Alice,显然那一半1的个数不超过500。这样Alice就可以把这部分对应的答案直接发给Bob,然后再把另外一半的串发给Bob,这样Alice需要发送的次数就是1500。
注意到Bob只发送了1000次,考虑对这个做法进行优化。
我们把Bob的串平均分成40份,然后取其中1的个数最少的26份发给Alice,在这之前先要发一个长度为40的01串表示我发哪些部分过去,这样Alice就可以直接把这26部分的答案发过来。接着Alice再把剩下的14部分直接发过去,让Bob来推出答案即可。
这么做Alice消耗的次数恰好是1350,Bob则消耗了1340次。
现在唯一的问题就是我不会在本地调试通信题,如果有大佬会的话麻烦教我一下。

代码

Alice

#include <iostream>
#include <fstream>
#include <string>using namespace std;ifstream fin;
char get_bit() {return getchar();
}
void send_bit(char ch) {putchar(ch);fflush(stdout);
}int n, m,a[55];
bool tag[55];
char c[2005];
string s;
struct init_t {init_t() {fin.open("alice.in");fin >> n >> m >> s;}
} init_t;int main() {int tot=0;for (int i=0;i<40;i++){char ch=get_bit();if (ch=='1') a[++tot]=i,tag[i]=1;}for (int i=0;i<tot*50;i++) c[i]=get_bit();int p=0;for (int i=1;i<=tot;i++)for (int j=0;j<50;j++){if (c[p]=='1') send_bit(s[a[i]*50+j]);p++;}for (int i=0;i<40;i++){if (tag[i]) continue;for (int j=0;j<50;j++) send_bit(s[i*50+j]);}}

Bob

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <cstdio>
#include <algorithm>using namespace std;ifstream fin;
char get_bit() {return getchar();
}
void send_bit(char ch) {putchar(ch);fflush(stdout);
}
ofstream fout;
void answer(string s) {fout << s << endl, exit(0);
}const int N = 1000;int n, m, pos[N + 1];
int val[55],t[55][55],a[55];
bool tag[55],vis[2005];
char Ans[2005];
struct init_t {init_t() {int x;fin.open("bob.in");fout.open("bob.out");fin >> n >> m;for (x = 1; x <= n; ++x) fin >> pos[x];}
} init_t;bool cmp(int x,int y)
{return val[x]<val[y];
}int main() {for (int i=1;i<=n;i++){int bel=(pos[i]-1)/50+1;vis[pos[i]]=1;val[bel]++;t[bel][val[bel]]=pos[i];}for (int i=1;i<=40;i++) a[i]=i;sort(a+1,a+40+1,cmp);for (int i=1;i<=26;i++) tag[a[i]]=1;sort(a+1,a+26+1);sort(a+27,a+40+1);for (int i=1;i<=40;i++) send_bit(tag[i]+'0');for (int i=1;i<=26;i++)for (int j=1;j<=50;j++)send_bit(vis[(a[i]-1)*50+j]+'0');for (int i=1;i<=26;i++)for (int j=1;j<=val[a[i]];j++)Ans[t[a[i]][j]]=get_bit();for (int i=27;i<=40;i++)for (int j=1;j<=50;j++)Ans[(a[i]-1)*50+j]=get_bit();string ans = "";for (int i=1;i<=n;i++)ans += Ans[pos[i]];answer(ans);
}

UOJ #454.【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. 【UOJ 454】打雪仗(通信题)(分块)

    打雪仗 题目链接:UOJ 454 题目大意 通信题. 两个人 A 有一个 2n 的 01 的字符串,B 有 n 个要知道的位置. 两个人可以传 01 给对方,然后最多的人不能传超过 4/3n(会多一点 ...

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

    正题 题目链接:https://uoj.ac/problem/454 题目大意 AliceAliceAlice有一个长度为2n2n2n的010101串,BobBobBob有nnn个在[1,2n][1, ...

  5. UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)

    题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...

  6. [UOJ#245][UER#7B]天路

    Description 给出n个数,对于每个k(2<=k<=n),求出最大的一个ans,使得存在一个连续的长度为k的区间中最大值和最小值的差为ans. 答案与标准答案的误差不超过5%即为正 ...

  7. 【UOJ】UER#3.B 开学前的日历

    将条件转化为i,j⩾0,i+j⩾k|Av+i,u+j+=(i+ji)i,j⩾0,i+j⩾k|Av+i,u+j+=(i+ji)i,j\geqslant 0,i+j\geqslant k|A_{v+i,u ...

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

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

  9. 【UER #8】打雪仗

    题目:http://uoj.ac/contest/47/problem/454 第一次做通信题,看了半天才搞懂是什么意思. 考虑把字符串拆成三段,每段长度为$\frac{2}{3}n$ 对于B: 统计 ...

最新文章

  1. Linux qfile中文文件名,QFile无法打开包含unicode字符的文件名
  2. 跳槽时,这些Java面试题99%会被问到
  3. nyoj 776 删除元素
  4. 不使用先验知识与复杂训练策略,从头训练二值神经网络!
  5. 【Java进阶】Eureka讲解与应用
  6. 在Ajax方式产生的浮动框中,点击选项包含某个关键字的选项
  7. 资深程序员:Python中你不知道的那些小工具
  8. 苹果手机内存怎么查_为什么苹果手机内存越用越小
  9. java安卓游戏源码下载_77个安卓游戏 android源码
  10. 全国哀悼日,英来网停站一天。
  11. 易课堂之算法注册机编写1
  12. 2011-6-9 有趣的Google能发声音乐电吉他Logo
  13. Apache Jena TDB 常用API
  14. ActionScript 3.0 杂乱笔记3
  15. 学习3d游戏建模的灵魂拷问20问,轻松征服游戏公司主美!
  16. 使用electron-vue开发公式编辑器
  17. 国内首本数据竞赛图书《阿里云天池大赛赛题解析——机器学习篇》今日开启预售!
  18. 打印某个月份的日历表!
  19. 网吧组网新趋势:双光纤接入+千兆到桌面(转)
  20. 史上最全-Appium自动化测试框架

热门文章

  1. 网页访问localhost出现用户名和密码登录弹窗
  2. 云旗OS助手火了!可一站式体验统信UOS
  3. MetaTrader 4 电脑版安装指南
  4. 小程序下载图片、文件、wx.downloadFile,废话少说直接上代码
  5. 产品读书《文案训练手册》
  6. 扫地机器人朋友圈文案_扫地机器人的简单文案
  7. linux 开发板模拟u盘,S5P4418开发板Linux下实现模拟U盘教程飞凌嵌入式
  8. python时间函数纳秒_python 时间 纳秒_Pandas时间序列(翻译)
  9. 最详细最直观的>>>理解Pandas分组聚合和透视图标
  10. understand中几个重要的工具