CF2155D Batteries 题解

题目传送门

思路

一道交互好题。策略是先从小到大枚举长度 \(len\),再枚举 \((a,a + len)\)。这样可以满足题意。

证明如下:在 \(n\) 个电池中有 \(a\) 个好电池,由鸽巢原理得,两个好电池的跨度在最坏情况下为 \(d_{\min} = \lfloor \displaystyle \frac{n}{a} \rfloor\)。所以我们一定会在 \(d \le d_{\min}\) 时找到一组答案。那此时需要的次数为:

\[\begin{aligned} \sum_{i=1}^d (n-i) = nd -\sum_{i=1}^d i \le nd \end{aligned} \]

\(d\) 的最坏情况 \(d_{\min} = \lfloor \displaystyle \frac{n}{a} \rfloor\) 代入可得次数 \(\le n \times \lfloor \displaystyle \frac{n}{a} \rfloor = \lfloor \displaystyle \frac{n^2}{a} \rfloor \le \lceil \displaystyle \frac{n^2}{a} \rceil\),故满足题意。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 45;

int t, n;

void solve()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j + i <= n; j++)
		{
			int x;
			printf("%d %d\n", j, j + i);
			fflush(stdout);
			scanf("%d", &x);
			if (x != 0) return;
		}
	}
}

int main()
{
	scanf("%d", &t);
	while (t--) solve();
	return 0;
}
posted @ 2025-10-19 10:56  lucasincyber  阅读(3)  评论(0)    收藏  举报