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