日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces - 1270D Strange Device(思维+构造)

發(fā)布時(shí)間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1270D Strange Device(思维+构造) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:規(guī)定一個(gè)含有n個(gè)元素的數(shù)組a,每個(gè)元素互不相等,但是全部未知,現(xiàn)在給出一臺(tái)機(jī)器,這臺(tái)機(jī)器有兩個(gè)參數(shù),分別是k和m,其意義是每次可以詢問k個(gè)下標(biāo),機(jī)器將給出k個(gè)下標(biāo)中第m大的下標(biāo)及其數(shù)值,現(xiàn)在k已知,要求在不超過n次詢問的情況下確定出m的大小

題目分析:看到這個(gè)題目給出的數(shù)據(jù)范圍是1<=m<=k<n,我第一反應(yīng)就是n其實(shí)沒有什么用,關(guān)鍵在于k,為了確定m,我們可以隨意取k+1個(gè)固定的數(shù),每次可以刪除掉其中的一個(gè),這樣對(duì)于剩下的k個(gè)數(shù)進(jìn)行不同組合應(yīng)該是可以確定出m的,為了方便我們直接取前k+1個(gè)數(shù)來進(jìn)行操作就好了,后來我想了想可不可以二分呢,大體思路就是先求出來1~k中第m大的數(shù),然后二分亂搞,后來也不知道怎么還讓我亂搞過去了六組測(cè)試點(diǎn),但突然一下子回過神來發(fā)現(xiàn)這個(gè)題目并不能二分,仔細(xì)想了一下我二分的其實(shí)是下標(biāo),本來一開始是想二分m的,但是m是不能二分得到的,于是趕快轉(zhuǎn)換思路

好在一開始的方向沒有錯(cuò),就是在前k+1個(gè)數(shù)中,每次刪掉一個(gè)數(shù)形成k+1種不同的組合,接著向下該怎么想呢?其實(shí)可以將全部情況大致分為下列兩種來思考:

  • m<=k/2
  • m>k/2
  • 為什么這樣想呢,首先我們籠統(tǒng)的分析一下,若刪掉前k+1中的某個(gè)數(shù)x,對(duì)機(jī)器造成的影響會(huì)是什么:

  • 如果x在前k+1個(gè)數(shù)中的大小大于m,那么機(jī)器返回的答案一定是第m大的數(shù)的相關(guān)數(shù)據(jù)
  • 如果x在前k+1個(gè)數(shù)中的大小小于等于m,那么機(jī)器返回的答案一定是第m+1大的數(shù)的相關(guān)數(shù)據(jù)
  • 仔細(xì)斟酌一下上面兩句話,我們可以發(fā)現(xiàn),如果以ans1表示第m大的數(shù)出現(xiàn)的次數(shù),用ans2表示第m+1大的數(shù)出現(xiàn)的次數(shù),那么答案一定是ans2,且ans1+ans2=k+1

    如此一來我們只需要記錄一下第m+1大的數(shù)出現(xiàn)的次數(shù)就能直接求出答案了

    代碼:

    #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=50;map<int,int>mp;int n,k;void print(int x) {printf("?");for(int i=1;i<x;i++)printf(" %d",i);for(int i=x+1;i<=k+1;i++)printf(" %d",i);printf("\n");fflush(stdout); }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);scanf("%d%d",&n,&k);for(int i=1;i<=k+1;i++){print(i);int pos,val;scanf("%d%d",&pos,&val);mp[val]++;}printf("! %d\n",mp.rbegin()->second);return 0; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的CodeForces - 1270D Strange Device(思维+构造)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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