首页 > 其他分享 >CF2022D1 Asesino

CF2022D1 Asesino

时间:2024-10-18 15:13:06浏览次数:6  
标签:cout No res2 res1 好人 CF2022D1 Asesino Yes

CF2022D1 Asesino

题意

交互题,有 \(n\) 个人,其中有一些好人和一些坏人,还有一个内鬼,你每次可以选择问一个人回答另一个人是不是好人,回答如下表:

好人 坏人 内鬼
好人 Yes No Yes
坏人 No Yes No
内鬼 No Yes -

例如,你问内鬼一个好人是不是好人,他会回答 No

你需要通过最多 \((n+69)\) 次询问找出内鬼。

思路

很显然,内鬼对另一人和另一人对内鬼的回答是相反的,而好人和坏人之间的回答是相同的,所以可以从头问到尾找出有内鬼嫌疑的两个人,再通过 \(2\) 次额外的询问找出内鬼,询问次数最大为 \((n+2)\) 次,我也不知道 \((n+69)\) 次是怎么给出来的。

代码

#include<bits/stdc++.h>
using namespace std;
int T,n;
signed main(){
	cin>>T;
	while(T--){
		cin>>n;
		string res1,res2;
		int id=0;
		for(int i=1;i<=n-(n%2);i+=2){
			cout<<"? "<<i<<" "<<i+1<<endl;
			cin>>res1;
			cout<<"? "<<i+1<<" "<<i<<endl;
			cin>>res2;
			if(res1!=res2){
				id=i;
				break;
			}
		}
		if(!id){
			cout<<"! "<<n<<endl;
			continue;
		}
		else{
			if(id==1){
				cout<<"? "<<id+1<<" "<<id+2<<endl;
				cin>>res1;
				cout<<"? "<<id+2<<" "<<id+1<<endl;
				cin>>res2;
				if(res1==res2)
					cout<<"! "<<id<<endl;
				else
					cout<<"! "<<id+1<<endl;
			}
			else{
				cout<<"? "<<id-1<<" "<<id<<endl;
				cin>>res1;
				cout<<"? "<<id<<" "<<id-1<<endl;
				cin>>res2;
				if(res1==res2)
					cout<<"! "<<id+1<<endl;
				else
					cout<<"! "<<id<<endl;
			}
		}
	}
	return 0;
}

标签:cout,No,res2,res1,好人,CF2022D1,Asesino,Yes
From: https://www.cnblogs.com/WuMin4/p/18474341

相关文章