hdu 3469 (tju 3552) Catching the Thief 博弈 数学题

来源:互联网 发布:软件自动化测试ppt 编辑:程序博客网 时间:2024/06/05 14:25
解题报告:
 事实上如果是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相间的出现”的时候对应的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;}

 

0 0