Skip to main content
Original184 words1 min

题解:P14319 「ALFR Round 11」C1 开关灯 (switch) (ez ver.)

Summary

交互题,n 盏灯中有一盏坏灯,连续两次翻转会失效。先对整个区间做一次翻转和查询,结果要么全亮,要么恰有一盏不亮;对全亮情形再翻一次即可归约成只有一盏灯与众不同的状态,然后二分查询区间亮灯数来定位这盏灯。n 不超过 500 时最多 3 加 9 等于 12 次操作。

解题思路​

先对整个区间 [1,n][1,n] 进行操作 11(翻转)和操作 22(查询),此时分为两种情况:

  1. 所有灯全亮;
  2. 只有 11 个灯不亮。

对于第一种情况,再次进行全局翻转。

由于坏灯不会连续两次翻转,必然只有 11 个灯亮,这样就转换为类似第二种情况。

此时有且仅有 11 个灯亮或不亮,通过二分查询即可定位。

最多需要 3+⌈log⁡2500⌉=3+9=123+\lceil\log_2 500\rceil=3+9=12 次操作。

参考代码​

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

int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
cout<<1<<' '<<1<<' '<<n<<endl;
cout<<2<<' '<<1<<' '<<n<<endl;
int k;
cin>>k;
if(k==n)cout<<1<<' '<<1<<' '<<n<<endl;
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
cout<<2<<' '<<l<<' '<<mid<<endl;
int t;
cin>>t;
if(k==n?t>0:t<mid-l+1)r=mid;
else l=mid+1;
}
cout<<3<<' '<<l<<endl;
}
return 0;
}