2021牛客暑期多校训练营3A-Guess and lies【dp】

1|0正题

题目链接:https://ac.nowcoder.com/acm/contest/11254/A


1|1题目大意

现在有一个y[1,n]Bob每次可以选择问Alice是否yxAlice可以说一次谎。Bob要在最少次数内确定y的值,而Alice尽量使得次数最多。

现在已知第一次Bob询问的是kAlice回答了是,对于k[1,n]求每个k Bob需要的最少询问次数。

1n2000


1|2解题思路

dls 在 WC 讲的神仙题目。

对于一种情况,假设y=i时,Alice说谎的次数是固定的,记这个次数为ai,所以如果当1n中只有一个数字满足ai1时那么答案就是这个数字了。

然后看Bob的操作,它每次可以选择一个xAlice可以选择让x的数字或者让<x的数字的位置ai=ai+1Bob需要用最少的次数使得只有一个位置ai1

发现因为每次都是覆盖一个前缀或者一个后缀,所以如果只保留ai=0/1的话那么所有的状态肯定是若干个1+若干个0+若干个1,分别记为a/b/c个,我们就可以设状态为fa,b,c进行转移。

考虑到随着c的增大我们肯定会尽量选择中间的位置,也就是决策位置是单调递增的,所以我们可以做到O(n3)的转移。

然后注意到这个和猜数字的规则很像,询问次数级别不会超过logn,所以我们可以考虑交换次数和一个值域,记fw,a,b表示猜测了w次能够猜出来的a0+b1+c0中最大的c,然后用决策单调性转移。

时间复杂度:O(n2logn)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=2100; int n,inf,f[20][N][N]; int calc(int u,int v){ int ans=19; while(ans&&f[ans-1][u][v]>=0)ans--; return ans; } int main() { scanf("%d",&n); memset(f,0xcf,sizeof(f)); inf=f[0][0][0]; for(int i=0;i<=1;i++) for(int j=0;j<=1-i;j++) f[0][i][j]=1-i-j; for(int i=1;i<=19;i++){ for(int j=0;j<=n;j++) for(int k=0;k<=j;k++){ int u=f[i-1][j-k][k]; int v=f[i-1][k][j-k]; if(u!=inf&&v!=inf){ u=min(u,n-j); f[i][u][j]=max(f[i][u][j],v); } } for(int j=0;j<=n;j++){ int v=f[i-1][j][0]; if(v!=inf){ for(int k=0;k<=n-j;k++){ int u=f[i-1][k][j]; if(u==inf)break; f[i][min(u,n-j)][j]=max(f[i][min(u,n-j)][j],v+k); f[i][min(v+k,n-j)][j]=max(f[i][min(v+k,n-j)][j],u); } } } for(int j=0;j<=n;j++) for(int k=n-j-1;k>=0;k--) f[i][k][j]=max(f[i][k][j],f[i][k+1][j]); } for(int i=0;i<n;i++) printf("%d ",calc(i,n-i)); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15931738.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
历史上的今天:
2021-02-24 CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
2021-02-24 AT4502-[AGC029C]Lexicographic constraints【二分,栈】
2021-02-24 AT4518-[AGC032C]Three Circuits【欧拉回路】
2021-02-24 YbtOJ#791-子集最值【三维偏序】
2021-02-24 P5110-块速递推【特征方程,分块】
点击右上角即可分享
微信分享提示