【cf专题】交互题

例题

#include<iostream>
using namespace std;
bool check(int x){
printf("%d\n",x);
fflush(stdout);
string res;cin>>res;
if(res==">=")return 1;
return 0;
}
int main(){
int l=1;int r=1000000;
while(l<r){
    int mid=(l+r+1)>>1;
    if(check(mid))l=mid;
    else r=mid-1;
}
printf("! %d\n",l);

fflush(stdout);
}

C. Password Cracking

#include<iostream>
using namespace std;

int n;
bool query(string x){
cout<<"? "<<x<<endl;
fflush(stdout);
bool res;
cin>>res;
return res;

}

int main(){

int T;cin>>T;
while(T--){
    cin>>n;string ans="";bool turn =1;
   while(ans.size()<n){
        if(turn){
            if(query(ans+"1")){
                ans+="1";
            }else if(query(ans+"0")){
            ans+="0";
            }else {
                turn=0;
            }
        }
        else {
 if(query("1"+ans)){
                ans="1"+ans;
            }else{
                ans="0"+ans;
            }

        }
   }

   cout<<"! "<<ans<<endl;
   fflush(stdout);
}


}

C. Chocolate Bunny

2n次查询pimodpj,找出排列
查询i j,查询j i,能得出较小的那个具体值
双指针

#include<iostream>
using namespace std;

const int N=10010;
int a[N];int n;

int main(){

cin>>n;
int i=1;int j=2;
for(;i<=n&&j<=n;){
    cout<<"? "<<i<<" "<<j<<endl;
    fflush(stdout);
    int t1;cin>>t1;
    cout<<"? "<<j<<" "<<i<<endl;
    fflush(stdout);
    int t2;cin>>t2;

    if(t1>t2){
        a[i]=t1;i=j;j++;
    }
    else {
            a[j]=t2;j++;
    }
}
a[i]=n;
cout<<"! ";
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}fflush(stdout);


}

A. Bear and Prime 100

如果是和数,必然至少能被分解成两个质数乘积
即使有一个是2,另外一个也是50之内
枚举【2,50】间的质数,如果整除就枚举另一个,最多15次

#include<iostream>
using namespace std;
/*2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97*/
int prime[16]={0,2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47};

int main(){

for(int i=1;i<=15;i++){
    cout<<prime[i]<<endl;fflush(stdout);
    string t;cin>>t;
    if(t=="yes"){
        for(int j=i;j<=15&&prime[i]*prime[j]<=100;j++){
            cout<<prime[i]*prime[j]<<endl;
            string t1;cin>>t1;
            if(t1=="yes"){
                cout<<"composite\n";
                return 0;
            }
        }
        cout<<"prime\n";
        return 0;
    }
}
cout<<"prime\n";
}

C. Guess The Tree

C. Web of Lies

D. Fixed Point Guessing

对于[l,r]询问,里面的元素如果是l<=x<=r,如果不是换的,那跟它换的一定也在里面,凑一对
所以如果[l,r]之间属于原数组的如果是奇数,答案就落在这个数组里。
如果是偶数,答案就不在这个区间

#include<iostream>
using namespace std;

int n;

int main(){
int T;cin>>T;
while(T--){
cin>>n;
int l=1;int r=n;
while(l<r){
    int mid=(l+r)>>1;
    cout<<"? "<<l<<" "<<mid<<endl;fflush(stdout);
    int cnt=0;
    for(int i=1;i<=mid-l+1;i++){int temp;
        scanf("%d",&temp);
        if(temp>=l&&temp<=mid)cnt++;
    }
    if(cnt&1)r=mid;
    else l=mid+1;
}
cout<<"! "<<l<<endl;fflush(stdout);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值