题目链接
题意:交互题,就是提问系统不超过1000次然后找到n颗龙珠,但龙珠是1颗1颗找到的并不是1次全部找到,这样就很简单了,每次循环输出1个(0,0),然后找到与远点相聚为d的所有的点,然后在分别提问,直至系统输出0为止。(题问是用cout的,系统给答案是用cin的),这个题要注意的是一定要加上换行符,下面是T0的代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
#define int long long
signed main()
{
vector<pair<int,int> > vec;
int n;
cin>>n;
while(n--)
{
vec.clear();
int x;
cout<<"0"<<" "<<"0";
cout.flush();
cin>>x;
for(int i=0;i*i<=x&&i<=1000000;i++)
{
int y=x-i*i;
if(sqrt(y)*sqrt(y)==y&&sqrt(y)<=1000000)
{
vec.push_back({i,sqrt(y)});
}
}
for(int i=0;i<vec.size();i++)
{
int k;
cout<<vec[i].first<<" "<<vec[i].second;
cout.flush();
cin>>k;
if(k==0) break;
}
}
return 0;
}
加上换行符后WA2了,下面是WA2代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
#define int long long
signed main()
{
vector<pair<int,int> > vec;
int n;
cin>>n;
while(n--)
{
vec.clear();
int x;
cout<<0<<" "<<0<<endl;
cout.flush();
cin>>x;
if(x==0) continue;
for(int i=0;i*i<=x&&i<=1000000;i++)
{
int y=x-i*i;
if(sqrt(y)*sqrt(y)==y&&sqrt(y)<=1000000)
{
vec.push_back({i,sqrt(y)});
}
}
for(int i=0;i<vec.size();i++)
{
int k;
cout<<vec[i].first<<" "<<vec[i].second<<endl;
cout.flush();
cin>>k;
if(k==0) break;
}
}
return 0;
}
在对照了n遍代码后,才找到了一个很不理解的错误,下面是AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
#define int long long
signed main()
{
vector<pair<int,int> > vec;
int n;
cin>>n;
while(n--)
{
vec.clear();
int x;
cout<<0<<" "<<0<<endl;
cout.flush();
cin>>x;
if(x==0) continue;
for(int i=0;i*i<=x&&i<=1000000;i++)
{
int y=x-i*i;
int cnt=sqrt(y);
if(cnt*cnt==y&&cnt<=1000000)
{
vec.push_back({i,sqrt(y)});
}
}
for(int i=0;i<vec.size();i++)
{
int k;
cout<<vec[i].first<<" "<<vec[i].second<<endl;
cout.flush();
cin>>k;
if(k==0) break;
}
}
return 0;
}
这次我记住了,sqrt(y)*(sqrt(y))是不能在判断中使用的,可能这类数学函数都不能这么用吧,pow也不可以,所以下一次最好将数学函数运算后的值先存入一个变量,然后再进行运算。