正题

题目链接:https://uoj.ac/problem/454


题目大意

AliceAliceAlice有一个长度为2n2n2n的010101串,BobBobBob有nnn个在[1,2n][1,2n][1,2n]位置的下标表示它想要得到010101串中这些位置的值,现在两个人可以向对方传输不超过mmm个0/10/10/1字符,要求使得BobBobBob可以得到答案。

1≤n≤1000,m=13501\leq n\leq 1000,m=13501≤n≤1000,m=1350


解题思路

两种方法,都是平均两边的传输信息。
第一种方法是从左到右传输010101串,由BobBobBob考虑若一个位置需要传输,那么传输111,然后AliceAliceAlice传输这个位置给他并考虑下一个位置。否则传输000,然后AliceAliceAlice跳过这个位置传输下一个位置给她然后再考虑下一个位置。
不难发现这样对于010101隔开的情况可以省略很多次数,所以我们直接随机打乱整个序列然后这样做即可。

第二种方法是将序列分为三块,BobBobBob用二进制告诉AliceAliceAlice需要信息最多的那个块。然后剩下两个块由BobBobBob告诉AliceAliceAlice需要传输哪些位置。
这样的次数AliceAliceAlice严格小于23n×2\frac{2}{3}n\times 232​n×2,BobBobBob严格小于43n+2\frac{4}{3}n+234​n+2,都在135013501350次内。

因为第二种方法比较普遍所以代码使用的是第一种方法


code

Alice

#include <iostream>
#include <fstream>
#include <string>
#include<cstdlib>
#include<cstdio>
#include<algorithm>using namespace std;ifstream fin;
char get_bit() {return getchar();
}
void send_bit(char ch) {putchar(ch);fflush(stdout);
}int n, m,c[2100],r[2100];
string s;
void init_t() {fin.open("alice.in");fin >> n >> m >> s;
}
int Z=17;
int randd(){Z++;return (Z*1931ll+Z*Z*3ll)%32767;
}
int main()
{init_t();for(int i=1;i<=2*n;i++)r[i]=i;for(int i=1;i<=20*n;i++)swap(r[randd()%(2*n)+1],r[randd()%(2*n)+1]);for(int i=1;i<=2*n;i++)c[r[i]]=s[i-1];int i=1;
//  for(int i=1;i<=2*n;i++)send_bit(c[i]); while(i<=2*n){char z=get_bit();if(z==EOF)break;if(z=='1'){send_bit(c[i]);i++;}else{i++;if(i>2*n)break;send_bit(c[i]);i++;}}return 0;
}

Bob

#include <iostream>
#include <fstream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;ifstream fin;
char get_bit() {return getchar();
}
void send_bit(char ch) {putchar(ch);fflush(stdout);
}const int N = 1000;int n, m, p[N + 1],r[N*2+10],w[N*2+10];
char s[N+1];
ofstream fout;
void answer() {fout.open("bob.out");for(int i=1;i<=n;i++)fout<<s[i];fout<<endl; exit(0);
}
void init_t() {int x;fin.open("bob.in");fin >> n >> m;for (x = 1; x <= n; ++x) fin >> p[x];
}
int Z=17;
int randd(){Z++;return (Z*1931ll+Z*Z*3ll)%32767;
}
int main() {init_t();for(int i=1;i<=2*n;i++)r[i]=i;for(int i=1;i<=20*n;i++)swap(r[randd()%(2*n)+1],r[randd()%(2*n)+1]);for(int i=1;i<=n;i++)p[i]=r[p[i]],w[p[i]]=i;sort(p+1,p+1+n);int z=1,i=1;while(i<=n){if(p[i]==z){send_bit('1');s[w[p[i]]]=get_bit();z++;i++;}else{send_bit('0');z++;if(z>2*n)break;s[w[p[i]]]=get_bit();if(p[i]==z)i++;z++;}}answer();return 0;
}

UOJ#454-[UER #8]打雪仗【通信题】相关推荐

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

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

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

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

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

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

  4. 【UOJ 454】打雪仗(通信题)(分块)

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

  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. SCCM 2012系列之一 Operations Manager 关键概念
  2. 通过ssh访问Back Track 5
  3. UITableView的使用及代理方法
  4. 北京理工大学计算机学院乔磊,邸慧军_北京理工大学计算机学院
  5. 数据仓库 迁移 大数据_从数据仓库迁移到大数据平台的最佳实践
  6. 在Postfix里给邮箱定虚拟别名
  7. (2022.5.27)【Win10】Windows10重置后微软商店闪退打不开、图片闪退打不开、UWP应用闪退打不开——可能的解决方案
  8. 【Axure】动态图表设计-柱状图、折线图、饼图(免费下载)
  9. vue使用LayIM组件接入第三方通讯平台:融云
  10. nxp_3|虚拟机Linux内核资源
  11. ubuntu18.04 安装flash。
  12. 专题7:动态规划 记忆化搜索
  13. 某985学历程序员嫌弃女朋友高职毕业学历低,但女朋友实在太漂亮,好犹豫!...
  14. 学习 FPGA 经验与书籍分享。
  15. 悲恸!5月22日13时07分,袁隆平院士逝世
  16. 直连线和交叉线的做法
  17. 一个想法:成立草根技术联盟对开发人员进行技术定级解决企业员工招聘难问题!
  18. 跟着团子学SAP PS—项目中的物料需求逻辑及导入程序设计要点(采购标识符/BAPI_NETWORK_COMP_ADD)
  19. Attention Mechanism[Transformer、Transformer-XL、XLNet]
  20. python3 清除过滤emoji表情

热门文章

  1. sv队列和动态数组的区别_Go 刷 LeetCode 系列:经典(7) 设计双端队列
  2. 怎么用java ee编程_Java EE应用程序入门 - 编程入门网
  3. 苹果白屏一直显示苹果_最新消息显示:苹果还要发新品
  4. linux sed 空间模式,整理:SED的模式空间与缓冲区及n,N,d,D,p,P,h,H,g,G,x解析...
  5. java class类型参数_使用Class对象实例化Java类型参数/ generic
  6. C++实现dijkstra单源最短路径
  7. [JavaWeb-Bootstrap]CSS样式和JS插件
  8. [汇编语言]实验五:编写,调试具有多个段的程序
  9. 蜘蛛牌 HDU - 1584(搜索——达到先让某些段先结合,达最优解)
  10. word List35