CF1028G Guess the Numbers 构造、记忆化搜索
考虑如果我们当前可以询问\(x\)个数,还剩下\(q\)次询问机会,我们要怎么构造询问方式?
肯定会这么考虑:
找到一个尽可能大的\(P\)满足\([x,P]\)能在每一次能询问\(x\)个数、剩下\(q-1\)次询问机会的情况下被询问出来,然后在这一次询问\(P+1\);
接下来令\(x=P+2\),再去做这一个操作直到\(q\)次询问都被问完。
那么我们现在要求解这个\(P\),也就是要求每一次能询问\(x\)个数、剩下\(q-1\)次询问机会的情况下最长可以求解多长的区间;而我们当前的问题可以看做可以询问\(x\)个数,还剩下\(q\)次询问机会能够求解最长多长的区间,可以发现前者是后者的一个子问题,可以\(DP\)处理。
设\(dp_{x,q}\)表示当前可以询问\(x\)个数,还剩下\(q\)次询问机会时最长的能够处理的区间长度。那么我们的转移如下:
①\(r_0=x\)
②\(r_i = r_{i-1} + dp_{min\{r_i,10000\},q-1} + 1\)
③\(dp_{x,q}=r_{q+1}-r_0\)
其中\(dp_{i,0}=0\),因为没有询问显然啥都不知道
我们每一次需要询问的序列为\(r_i-1\)。
显然复杂度是\(O(5 \times 10^8)\)的,但我们只需要解决\(dp_{1,5}\),其中有很多冗余状态,实际上可以记忆化搜索解决。
然后考虑如何进行询问。
我们的初始的最长解决长度是\(dp_{1,5}\),初始的最小知道的值为\(cur=1\),询问次数为\(q=5\),那么我们按照下面这种方法进行交互:
①构造上面对应的询问序列,询问一次
②得到\(K\)
③如果\(K=-1\)直接退出,否则\(cur=r_K\),最长解决长度变为\(dp_{min(cur,10000),q-1}\)
④\(q--\),回到第\(1\)步
然后就做完了
思路的确比较火
还有\(dp_{1,5}\)就等于\(M\)到底是什么鬼啊喂
#include<bits/stdc++.h>
#define int long long
//This code is written by Itst
using namespace std;
const int MAXN = 10004205361450474ll;
int dp[10010][5];
vector < int > query;
int dfs(int l , int q){
if(!q)
return 0;
if(l > 10000)
l = 10000;
if(dp[l][q])
return dp[l][q];
int r = l;
for(int i = 1 ; i <= l ; ++i)
r = r + dfs(r , q - 1) + 1;
r = r + dfs(r , q - 1);
return dp[l][q] = r - l;
}
void interact(){
int cur = 1 , q = 5 , K;
for(int i = 1 ; i <= 5 ; ++i){
query.clear();
query.push_back(cur - 1);
int now = cur;
for(int j = 1 ; j <= min(cur , 10000ll) ; ++j){
now += dp[min(now , 10000ll)][q - 1];
query.push_back(now);
++now;
}
cout << query.size() - 1 << ' ';
for(int i = 1 ; i < query.size() ; ++i)
cout << query[i] << ' ';
cout << endl;
cin >> K;
if(K == -1)
exit(0);
cur = query[K] + 1;
--q;
}
}
signed main(){
dfs(1 , 5);
interact();
return 0;
}
CF1028G Guess the Numbers 构造、记忆化搜索的更多相关文章
- 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】
任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 1048576K,其他语言2097152K6 ...
- hdu 5535 Cake 构造+记忆化搜索
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问 ...
- POJ 3252 Round Numbers(数位dp&记忆化搜索)
题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...
- 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)
链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- cdoj Dividing Numbers 乱搞记忆化搜索
//真tm是乱搞 但是(乱搞的)思想很重要 解:大概就是记忆化搜索,但是原数据范围太大,不可能记下所有的情况的答案,于是我们就在记下小范围内的答案,当dfs落入这个记忆范围后,就不进一步搜索,直接返回 ...
- HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)
Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化
Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...
- hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)
pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
随机推荐
- Linux 下修改网卡接口名
Linux下修改网卡接口名 by:授客 QQ:1033553122 (测试环境:CentOS-6.0-x86_64-bin-DVD1.iso+Vmware) 作用 可以用于解决类似如下Device n ...
- 安卓开发_WebView如何在Fragment中使用
之前学习了如何在activity中使用WebView控件来显示网页. 在我的实际开发中,有需要在Fragment中用到WebView控件的,那么就百度学习了一下 其实很简单,但是当然不是和在Activ ...
- python中常用函数整理
1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object): ""&q ...
- 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
其实在最前面的某一篇博文里,是绝对提过编码的,有ASCII,有UTF-8,有GB2312等等,这些我绝对说过的. url编码 首先,Http协议中参数的传输是"key=value" ...
- python第九十五天--js正则
定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^ ...
- 第三章————用SQL语句操作数据
第三章————用SQL语句操作数据 *********************新增**************************** 1. insert into 表名(列名1,列名2...) ...
- nslookup debug
Try adding forwarders to some public DNS servers leave the box ticked which says use root hints if f ...
- python中urllib的整理
本不想使用这个玩意,奈何看到很多地方使用,随手整理下 urllib模块提供的urlretrieve()函数,urlretrieve()方法直接将远程数据下载到本地 urlretrieve(url, f ...
- Python基础知识:字符串
1.Python中大写字母命名的变量,默认为常量,不可修改:列如:MYSQL_CONNECTION = '192.168.1.1' 2.字符串换行输入格式:换行用\隔开,两行分别用引号,制表符\t,换 ...
- flask框架的教程--虚拟环境的安装[一]
为什么需要安装虚拟环境呢? 因为虚拟环境中扩展包对本机软件中不影响 安装 查看是否安装了虚拟环境 安装虚拟环境的第三方工具 sudo pip install virtualenv sudo pip i ...