UOJ#405. 【IOI2018】组合动作

原文链接https://www.cnblogs.com/zhouzhendong/p/IOI2018Day1T1.html

题解

  首先二分一下,花费2次操作求出第一位的字符。

  假设第一个字符是 Y,答案字符串的长度为 i-1 的前缀是 S,我们考虑如何只花费1次询问得到下一个字符。

  press(SAA,SAB,SAX,SB) - (i-1)

  如果是 0 ,那么下一个字符是 X

  如果是 1 ,那么下一个字符是 B

  如果是 2 ,那么下一个字符是 A

  最后一个字符花费 2次操作暴力询问即可。

  这样刚好需要 n+2 次操作。

代码

#include <bits/stdc++.h>
#include "combo.h"
using namespace std;
char c[4]={'A','B','X','Y'};
string guess_sequence(int n){
	string ans;
	if (press("AB"))
		ans=press("A")?"A":"B";
	else
		ans=press("X")?"X":"Y";
	if (n==1)
		return ans;
	for (int i=0;i<3;i++)
		if (c[i]==ans[0]){
			swap(c[i],c[3]);
			break;
		}
	for (int i=2;i<n;i++){
		int tmp=press(ans+c[0]+c[0]+ans+c[0]+c[1]+ans+c[0]+c[2]+ans+c[1])-(i-1);
		ans+=c[2-tmp];
	}
	if (press(ans+c[0])==n)
		ans+=c[0];
	else if (press(ans+c[1])==n)
		ans+=c[1];
	else
		ans+=c[2];
	return ans;
}

  

猜你喜欢

转载自www.cnblogs.com/zhouzhendong/p/IOI2018Day1T1.html
今日推荐