codeforces1007C

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liufengwei1/article/details/81982552

这是曾今一场爆炸的我的第一场div1,然后跟aols和hls一起3人下紫,紫名一场体验结束。B题一直没想到做法,然后这题我是两个数的log乘起来,log1e18=60,60*60=3600就已经超过600组了,我并没有什么办法。于是看到很多神仙代码,写的各种神仙策略的判断都过了,这里是一个比较易懂的做法。我们只确定下界,然后用二进制数字去逼近,超过就2个一起缩小,小于了就下界加上当前数字。这样的复杂度就是一个log了,再加上一些冗余,还是能A的

#include<cstdio>
#include<cstring>

long long n,a,b,adda,addb,ans;

inline void print(long long x,long long y)
{
	printf("%lld %lld\n",x,y);
	fflush(stdout);
	scanf("%lld",&ans);
}

inline long long max(long long x,long long y)
{
	if(x>y)
		return x;
	else
		return y;
}

inline long long min(long long x,long long y)
{
	if(x<y)
		return x;
	else
		return y;
}

int main()
{
	scanf("%lld",&n);
	a=0;b=0;adda=1;addb=1;
	print(a+adda,b+addb);
	while(ans)
	{
		if(ans==1)
			a+=adda,adda=min(adda<<1,n-a);
		if(ans==2)
			b+=addb,addb=min(addb<<1,n-b);
		if(ans==3)
			adda=max(adda>>1,1ll),addb=max(addb>>1,1ll);
		print(a+adda,b+addb);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/81982552