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;
}

浙公网安备 33010602011771号