[xsy3553]游戏
题意:交互题,交互库有长为$n$的$01$串$S$,你可以用字符串$T$询问$\sum\limits_{i=1}^n[S_i=T_i]$,要求用$1030$次询问问出$S$,$n=5000$
首先我们可以问出一个集合内有多少个$1$,接下来的询问就是指问集合内$1$的个数,记集合$S$的答案为$ans_S$
我们硬点一个方案的最后一次询问是问总共有多少$1$
如果可以用$k$次询问问出长为$n$的串,那么可以用$2k$次询问问出长为$2n+k-1$的串,构造如下
把串分成三部分:$1\cdots n,n+1\cdots 2n,2n+1\cdots 2n+k-1$,记为$A,B,C$
设对$A$询问的集合为$P_{1\cdots k}$,对$B$询问的集合为$Q_{1\cdots k}$
对$i=1\cdots k-1$,问$P_i\bigcup Q_i$和$(A-P_i)\bigcup Q_i\bigcup\{C_i\}$,倒数第二次问$A$
两个询问结果之和是$ans_A+2ans_{Q_i}+C_i$,和$ans_A$比较奇偶性可以知道$C_i$,继而推出$ans_{Q_i},ans_{P_i}$,做完之后也自然知道了$ans_{Q_k}$,于是递归下去做就行了
当$n=5000$时,这个做法需要$1024$次询问
感觉这个题很巧妙啊?
#include"game.h" #include<string.h> #include<vector> using namespace std; typedef vector<int> vi; int n; string t; int sum; int get(vi v){ int siz; t=string(n,'1'); siz=0; for(int x:v){ if(x>n)break; t[x-1]='0'; siz++; } return(siz-guess(t)+sum)/2; } vi al(int n){ vi v; for(int i=1;i<=n;i++)v.push_back(i); return v; } vi sh(vi a,int b){ for(int&x:a)x+=b; return a; } bool us[6010]; vi inv(vi a,int n){ vi c; memset(us,0,n+1); for(int x:a)us[x]=1; for(int i=1;i<=n;i++){ if(!us[i])c.push_back(i); } return c; } vi operator+(vi a,vi b){ a.insert(a.end(),b.begin(),b.end()); return a; } struct sol{ int n; vector<vi>a; void add(vi v){ a.push_back(v); } }w[20]; void pre(){ int n,k,i,j; vi t; w[1]={2,{{1},{1,2}}}; for(i=2;i<=10;i++){ k=w[i-1].a.size(); n=w[i-1].n; w[i].n=n*2+k-1; for(j=0;j<k-1;j++){ vi&u=w[i-1].a[j]; w[i].add(u+sh(u,n)); t=inv(u,n)+sh(u,n); t.push_back(n*2+j+1); w[i].add(t); } w[i].add(al(n)); w[i].add(al(w[i].n)); } } int res[6010]; void solve(int sh,int id,vi r){ if(id==1){ res[sh+1]=r[0]; res[sh+2]=r[1]-r[0]; return; } int n,k,i,c,t,al; vi ra,rb; n=w[id-1].n; k=w[id-1].a.size(); c=r[k*2-2]; al=r[k*2-1]-c; for(i=0;i<k-1;i++){ t=res[sh+n*2+i+1]=((r[i*2]+r[i*2+1])^c)&1; al-=t; rb.push_back(t=(r[i*2]+r[i*2+1]-t-c)/2); ra.push_back(r[i*2]-t); } ra.push_back(c); rb.push_back(al); solve(sh,id-1,ra); solve(sh+n,id-1,rb); } const int mx=10; string game(int _n,int k){ n=_n; vi r; string s(n,'1'); pre(); sum=guess(s); for(vi v:w[mx].a)r.push_back(get(v)); solve(0,mx,r); for(int i=0;i<n;i++)s[i]=res[i+1]+'0'; return s; }
[xsy3553]游戏的更多相关文章
- 使用HTML5开发Kinect体感游戏
一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- Unity游戏内版本更新
最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...
- 游戏服务器菜鸟之C#初探一游戏服务
本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...
- iOS审核这些坑,腾讯游戏也踩过
作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...
- 漫谈C#编程语言在游戏领域的应用
0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...
- 解构C#游戏框架uFrame兼谈游戏架构设计
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
- 趣说游戏AI开发:曼哈顿街角的A*算法
0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...
- 拼图小游戏之计算后样式与CSS动画的冲突
先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...
随机推荐
- A A=new A();
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- 高性能MySQL(一)——索引
一.mysql索引分类 单值索引:一个索引只包含单个列,一个表可以有多个单列索引 唯一索引:索引列的值必须唯一,但允许有空值 复合索引:一个索引包含多个列 基本语法: 创建:1.CREATE [UNI ...
- node 进程管理 child_process [spawn,exec] | 珠峰培训node正式课 网络爬虫
run.js ; function set(){ i++ setTimeout(function(){ console.log(i) ){ set(); } },) }set(); child_pro ...
- moya
https://juejin.im/post/5ac2cf34f265da23a1421483 https://juejin.im/post/5a69e9f9f265da3e290c6782
- react navite 学习资料
react 学习资料 https://github.com/crazycodeboy/GitHubPopular crazycodeboy/GitHubPopular https://github.c ...
- vue 实战
vue 实战 Vue命令行工具vue-cli https://www.cnblogs.com/xiaohuochai/p/7277771.html https://github.com/ymblog/ ...
- Codeforces Round #558 (Div. 2)-Cat Party (Hard Edition)-(前缀和 + 模拟)
http://codeforces.com/problemset/problem/1163/B2 题意:有n天,每天有一个颜色,截取前x天,随便抽掉一天,使剩下的各个颜色出现的次数相等. 解题,也可以 ...
- scala 学习笔记--模式匹配
1.switch java代码 switch (cause) { case ‘2‘ : dropTime=time; case ‘8’:case ‘9’ : case ‘10’:case ‘11’ : ...
- 洛谷P1962 斐波那契数列题解
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
- shell 脚本接收参数
test.sh #!/bin/bash echo "脚本名$0" echo "第1个参数$1" echo "第2个参数$2" echo &q ...