D - Dragon Balls Kattis - dragonballs

33 篇文章 1 订阅

题目链接
在这里插入图片描述
题意:交互题,就是提问系统不超过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也不可以,所以下一次最好将数学函数运算后的值先存入一个变量,然后再进行运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值