加载中...

猜猜循环长度

题意:

存在一个n个节点的环,你不知道n的大小,你可以询问两个节点的距离,会返回两个节点的路径长度,一共有2条,一条长一条短。只能询问50次,请猜出n的大小。

分析:

我们发现对于任意两个点,只要询问两次,如果答案不一样,那么其相加结果之和就是一整个环。因此我们直接任找两个点,算一下即可。我们按顺序枚举1和i,如果出界了答案就是i,否则我们需要找到两个答案不同的值。

signed solve() 
{
	for(int i = 1; i <= 25; i ++ ) 
	{
		cout << "? 1 " << i + 1 << endl;
		long long len1, len2;
		cin >> len1;
		if(len1 == -1) //说明爆了 
		{
			cout << "! " << i << endl;
			return 0;
		}
		cout << "? " << i + 1 << " 1" << endl;
		cin >> len2;
		if(len1 != len2) //一长一短长度不一样
		{
			cout << "! " << len1 + len2 << endl;
			return 0;
		}
	}
	return 0;
}
posted @ 2022-09-19 22:03  liang302  阅读(30)  评论(0编辑  收藏  举报