Codeforces Round #610 (Div. 2) D. Enchanted Artifact(思维)

题目链接:https://codeforces.com/contest/1282/problem/D

 

题目大意:

  交互题,每次输出一个字符串,然后会返回一个数字,表示输出的字符串和答案之间的编辑距离,编辑距离的定义是一个字符串使用插入、删除、替换变成另一个字符串的最小次数。希望能在答案字符串的长度+2的询问次数内找到答案字符串

 

题目思路:

  看到rating2300后被吓退的某菜鸡。。。感谢卿学姐的讲解:传送门
  讲道理,其实并不是很难。。首先先得得到答案的长度,先输出一个a,然后就会得到一个数字n,然后输出n+1长度的a,又得到一个数字m,除非全是b,否则这个数字一定会变小或不变,如果变大的话那就直接输出n个b,否则就获悉答案是一个长度为n+1的字符串,然后每次变动一个字母,观察返回的数字是否变小,如果变小那就改成b,否则保持a。
  一个坑点,题目说了,输出的字符串长度不能超过300,所以如果输出a返回的数字是300的话,不能输出301个a,否则就wa了,这个时候可以发现,答案字符串最多也就300个字符,那肯定答案就是300个b。

 

以下是代码:

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
const int MAXN = 2e5+5;
const int MOD = 10007;
string s;
int main(){
    cout<<"a"<<endl;
    cout.flush();
    int n,m;
    scanf("%d",&n);
    if(!n)return 0;
    if(n==300){
        rep(i,1,300)cout<<"b";
        cout<<endl;
        cout.flush();
        scanf("%d",&m);
        if(!m)return 0;
    }
    string s="";
    rep(i,1,n+1)s+="a";
    cout<<s<<endl;
    cout.flush();
    scanf("%d",&m);
    if(!m)return 0;
    if(n<m){
        rep(i,1,n)cout<<"b";
        cout<<endl;
        cout.flush();
        scanf("%d",&n);
        if(!n)return 0;
    }
    else{
        rep(i,0,n){
            s[i]='b';
            cout<<s<<endl;
            cout.flush();
            int x;
            scanf("%d",&x);
            if(!x)return 0;
            if(x<m){
                m=x;

            }
            else s[i]='a';
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值