日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時間:2023/12/3 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021牛客暑期多校训练营3A-Guess and lies【dp】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題

題目鏈接:https://ac.nowcoder.com/acm/contest/11254/A


題目大意

現(xiàn)在有一個y∈[1,n]y\in[1,n]y[1,n]BobBobBob每次可以選擇問AliceAliceAlice是否y≥xy\geq xyxAliceAliceAlice可以說一次謊。BobBobBob要在最少次數(shù)內(nèi)確定yyy的值,而AliceAliceAlice盡量使得次數(shù)最多。

現(xiàn)在已知第一次BobBobBob詢問的是kkkAliceAliceAlice回答了是,對于k∈[1,n]k\in[1,n]k[1,n]求每個kkk BobBobBob需要的最少詢問次數(shù)。

1≤n≤20001\leq n\leq 20001n2000


解題思路

dlsdlsdls 在 WC 講的神仙題目。

對于一種情況,假設(shè)y=iy=iy=i時,AliceAliceAlice說謊的次數(shù)是固定的,記這個次數(shù)為aia_iai?,所以如果當(dāng)1~n1\sim n1n中只有一個數(shù)字滿足ai≤1a_i\leq 1ai?1時那么答案就是這個數(shù)字了。

然后看BobBobBob的操作,它每次可以選擇一個xxxAliceAliceAlice可以選擇讓≥x\geq xx的數(shù)字或者讓<x<x<x的數(shù)字的位置ai=ai+1a_i=a_i+1ai?=ai?+1BobBobBob需要用最少的次數(shù)使得只有一個位置ai≤1a_i\leq 1ai?1

發(fā)現(xiàn)因為每次都是覆蓋一個前綴或者一個后綴,所以如果只保留ai=0/1a_i=0/1ai?=0/1的話那么所有的狀態(tài)肯定是若干個111+若干個000+若干個111,分別記為a/b/ca/b/ca/b/c個,我們就可以設(shè)狀態(tài)為fa,b,cf_{a,b,c}fa,b,c?進(jìn)行轉(zhuǎn)移。

考慮到隨著ccc的增大我們肯定會盡量選擇中間的位置,也就是決策位置是單調(diào)遞增的,所以我們可以做到O(n3)O(n^3)O(n3)的轉(zhuǎn)移。

然后注意到這個和猜數(shù)字的規(guī)則很像,詢問次數(shù)級別不會超過log?n\log nlogn,所以我們可以考慮交換次數(shù)和一個值域,記fw,a,bf_{w,a,b}fw,a,b?表示猜測了www次能夠猜出來的aaa000+bbb111+ccc000中最大的ccc,然后用決策單調(diào)性轉(zhuǎn)移。

時間復(fù)雜度:O(n2log?n)O(n^2\log n)O(n2logn)


code

#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;}

總結(jié)

以上是生活随笔為你收集整理的2021牛客暑期多校训练营3A-Guess and lies【dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。