codecamp

2.2.4 PARTY LAMPS 派对灯

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2328
题目大意:(如题)
输入输出:(如题)
解题思路:
1.因为每个按钮按2次和没按效果是一样的。所以每个按钮或者按或者不按,一共有2^4=16中状态。
2.然后因为这个电灯系统有个性质,每6个一循环,所以把这4个按钮的16种状态对应的前6个灯的状态枚举出来。然后分析,发现一下规律:
-按1和按2相当于按3;
-按2和按3相当于按1;
-按1和按3相当于按2;
-按1按2和按3相当于不按;
-相差3的倍数也可以相互转换;
消重之后得到8种按法:不按,按1,按2,按3,按4,按1按4,按2按4,按3按4。
相对应的最少按的次数为:0,1,1,1,1,2,2,2。
3.参照了NOCOW-USACO上的一个比较邪恶的方法-常量表法,把前6个灯的状态保存在light数组里面,然后用一个minnum数组存储相应状态的按的次数。如下:
  1. int light[9][7]={  
  2.     0,0,0,0,0,0,0,  
  3.     0,0,0,0,0,0,0,//按1  
  4.     0,0,0,1,1,1,0,//按1按4  
  5.     0,0,1,0,1,0,1,//按3  
  6.     0,0,1,1,0,1,1,//按1按4  
  7.     0,1,0,0,1,0,0,//按4  
  8.     0,1,0,1,0,1,0,//按2  
  9.     0,1,1,0,0,0,1,//按2按4  
  10.     0,1,1,1,1,1,1,//不按  
  11. };//常量表  
  12.    
  13. int minnum[9]={0,1,2,1,1,2,1,2,0};//对应常量表8个状态最少摁的次数  
4.然后就可以开始写代码了,嘿嘿
核心代码:
  1. flag1=false;  
  2.     for(i=1;i<9;i++)  
  3.     {  
  4.         flag2=true;  
  5.         for(j=1;j<=n;j++)  
  6.         {  
  7.             if(dat[j]==-1)//如果没有确定是亮或灭  
  8.                 continue;  
  9.             tmp=j%6;//六位循环  
  10.             if(tmp==0)//如果是6的倍数  
  11.                 tmp=6;  
  12.             if(dat[j]!=light[i][tmp])//有个灯不同说明不是这个状态,结束判断  
  13.             {  
  14.                 flag2=false;  
  15.                 break;  
  16.             }  
  17.         }  
  18.         if(flag2==true&&c>=minnum[i])  
  19.         {  
  20.             flag1=true;//有一个满足条件就标记  
  21.             for(j=1;j<=n;j++)  
  22.             {  
  23.                 tmp=j%6;  
  24.                 if(tmp==0)  
  25.                     tmp=6;  
  26.                 cout<<light[i][tmp];  
  27.             }  
  28.             cout<<endl;  
  29.         }  
  30.     }  
  31.     if(flag1==false)  
  32.         cout<<"IMPOSSIBLE"<<endl;  


2.2.3 RUNAROUND NUMBERS 循环数
2.3.1 LONGEST PREFIX 最长前缀
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }