博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【USACO 2.2】Party Lamps
阅读量:6016 次
发布时间:2019-06-20

本文共 1516 字,大约阅读时间需要 5 分钟。

四种开关,n盏灯,1:改变所有灯状态,2:改变奇数灯状态,3:改变偶数灯状态,4:改变3k+1灯状态

给你按开关的总次数c和部分灯限制条件(开或关),一开始都是开着的。($c \leq 10000,n \leq 100$)

我直接考虑每个开关按了奇数次或偶数次,因为顺序和总次数不影响结果,重要的是每种开关按的次数是奇数还是偶数次。

题解里有个flip[i]= (1<<6-1)&0x55 和与上0xAA,分别代表2、3开关,因为0x55就是01010101,0xAA就是10101010,每次异或上相应的flip[i],就是开关的操作。

/*LANG:C++TASK:lamps*/#include
#include
#include
#define N 105using namespace std;int n,c,a,cnt;bool on[N],off[N],sta[N];string ans[10];bool ck(int id,int a,int b,int c,int d){ bool ans=1; if(a&1)ans=!ans; if(id%2){ if(b&1)ans=!ans; }else if(c&1)ans=!ans; if(id%3==1&&d&1)ans=!ans; return ans;}bool get(){ bool fd=0; for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) for(int l=0;l<=1;l++) if(i^j^k^l^c==0&&i+j+k+l<=c){ //奇数次的开关为奇数个,则总次数为奇数,因此异或起来为0 //总次数不能超过c // printf("%d %d %d %d\n",i,j,k,l); bool ok=1; for(int la=1;la<=n;la++) if(ck(la,i,j,k,l)){ if(off[la]){ ok=0;break; } sta[la]=1; }else { if(on[la]){ ok=0;break; } sta[la]=0; } if(ok){ for(int i=0;i

 

  

转载地址:http://usyqx.baihongyu.com/

你可能感兴趣的文章
/etc/profile文件内容
查看>>
量词 匹配优先与忽略优先
查看>>
一页纸IT项目管理:大道至简的实用管理沟通工具
查看>>
汽车知识:车内异味的清除方法
查看>>
IE6 7下绝对定位引发浮动元素神秘消失
查看>>
浏览器的回流和重绘及其优化方式
查看>>
Eclipse基金会发布Eclipse Photon IDE
查看>>
jQuery选择器和事件
查看>>
2.4 salt grains与pillar jinja的模板
查看>>
VDI序曲二十 桌面虚拟化和RemoteApp集成到SharePoint 2010里
查看>>
cx_Oracle install
查看>>
jquery ajax从后台获取数据
查看>>
Nginx下载服务生产服务器调优
查看>>
移动互联网,入口生死战
查看>>
nginx面试常问题目
查看>>
制作ubuntu系统u盘镜像,以及安装
查看>>
JAVA多线程深度解析
查看>>
Kafka High Level Consumer 会丢失消息
查看>>
时间轴
查看>>
java 获取系统当前时间的方法
查看>>