题意:给一个数列,给你最多n次提问其中k个位序(k已知),返回升序排列时第m(未知)个大的位序和数值
策略:因为不可能k=n那无法求出
所以k+1<=n
因此选取前k+1位序,取k+1次,将这个k+1项作升序考虑,去掉某一项后,第m个可能为排序后的第m位序或者m+1位序,若删去的是1到m(闭)则为m+1因此后者会出现m次(即为目标答案)
而后者的特征即为数值大于前者,而又只会出现两个值,因此只要计数大者的次数即可
思维构造+位序条件的干扰(实际只需排序考虑即可)
有时候求出某个值不一定非得是直接的对象,有时候转化为别的量也可以处理如这里的个数
https://codeforces.com/contest/1270/problem/D
#include<bits/stdc++.h>
using namespace std;
int main ()
{
int n,k,m;
cin>>n>>k;
int cnt1=0,cnt2=0;
int a;
int p1;
int p2;
int f=0;
for(int i=1;i<=k+1;++i)
{
cout<<"?";
for(int j=1;j<=k+1;++j)
{
if(i==j)
continue;
cout<<" "<<j;
}
cout<<endl;//注意交互回车
cout.flush();
int t;
cin>>t>>a;
if(f==0)
{
p1=a;
f=1;
}
if(p1==a)
cnt1++;
else
{
p2=a;
cnt2++;
}
}
if(p1>p2)
cout<<"! "<<cnt1;
else cout<<"! "<<cnt2;
return 0;
}