解题报告:
事实上如果是n(n>2)个房,答案就是2n-4,具体探法是: 2,3,4...(n-2),(n-1);\(n-1),(n-2),(n-3)...3,2
证明(感觉像在做高中数学题):还是以5个房为例子,对于小偷可能在的房间标以"0”来表示;小偷不可能在的房间标以"1”来表示?;S代表当天探索的房间,当然,S=1
0:0 0 0 0 0
1:0 S 0 0 0
2:1 0 S 0 0
3:0 1 0 S 0
4:1 0 1 S 1
5:0 1 S 1 1
6:1 S 1 1 1
假设第i天第j个房状态为X[i,j],?我们的目标就是从全0变成全1
每一天我们可以指定某个X[i,j]=S=1,其他X[i,j]?=X[i-1,j-1]?*?X[i-1,j+1]。简单的说,就是除了搜索的房间,其他任何房间的值必定小于等于它左边房间或右边房间上一天的值。设一个函数Y,Y等于两头房间的值加上两倍中间n-2个房间的值 Y[i]=X[i,1]+2*X[i,2]+2*X[i,3]+2*X[i,4]+......+2*X[i,n-2]+2*X[i,n-1]+X[i,n]
那如果不考虑搜索的房间,Y肯定每天都在变小,因为:
?第1间房至第n-1间房的值分别小于前一天第2间房至第n间房的值
?第2间房至第n间房的值又分别小于前一天第1间房至第n-1间房的值
除了四种情况:全部房间都是0;全部房间都是1;奇数号房间都是0偶数号房间都是1;奇数号房间都是1偶数号房间都是0(后两者成为“0,1相间的出现”)但是全是1是最终态,所以也就是三种情况了
由于S的存在,最多可以使Y增加2,就是说除了上述的情况,Y每天可以增加1;而出现上述情况时,Y最多可以加2。
那么要从初始状态的全0(Y=0)变到最终的全1(Y=2n-2),正常来说最快需要2n-2天。
考虑到如果在每天都有增加的情况下,可以出现一次“全部房间都是0”以及一次“0,1相间的出现”,所以可以再少两天,就是2n-4天
除了四种情况:全部房间都是0;全部房间都是1;奇数号房间都是0偶数号房间都是1;奇数号房间都是1偶数号房间都是0(后两者成为“0,1相间的出现”)但是全是1是最终态,所以也就是三种情况了
由于S的存在,最多可以使Y增加2,就是说除了上述的情况,Y每天可以增加1;而出现上述情况时,Y最多可以加2。
那么要从初始状态的全0(Y=0)变到最终的全1(Y=2n-2),正常来说最快需要2n-2天。
考虑到如果在每天都有增加的情况下,可以出现一次“全部房间都是0”以及一次“0,1相间的出现”,所以可以再少两天,就是2n-4天
有人说,为什么不可以出现两次“0,1相间的出现”的情况?
因为“0,1相间的出现”的时候对应的Y值为n或n+1。
在每天Y都在增加的情况下,即使出现了两次“0,1相间的出现”的情况,它们分别等于n和n+1,那么第一次出现也没有为Y带来2的飞跃,所以没有任何意义。
代码:
#include<stdio.h>
int main()
{
int t,n,i,result;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&n);
if(n==1)
result=1;
else if(n==2)
result=2;
else
result=2*n-4;
printf("Case %d: %d\n",i,result);
}
return 0;
}