usaco 2.2.4 生日派对灯(最近写题碰到的,虽然知道现在写这个有点晚了)
经过分析,他看似很多的开灯的方法其实合并起来就只有八个。
首先,一个开关在执行的时候只能按一次(因为你就算按了两次就相当于一次也没有按)。
当一个都不按的时候 当然就只有一种:不按。
当按一下的时候:很明显(1)(2)(3)(4)四种。
当按两下的时候:(1,2)(1,3)(1,4)(2,3)(2,4)(3,4)。 然而(1,2)就相当于是3;(1,3)=2;(2,3)=1;所以按两下的就只有(1,4)(2,4)(3,4)。
当按三下的时候:(1,2,3)(1,2,4)(1,3,4)(2,3,4)....。然而都可以相当于 空(3,4)(2,4)(1,4)也就是什么都没有了 QWQ;
按四下:应该就可以发现其实也是能和前面的合并;
所以所有的策略中就只有8中了:空 (1)(2)(3)(4)(1,4)(2,4)(3,4)。
这就已经把按灯的套路合并完了。
-----------------------------接下来是计数器c的情况的分析----------------------------------------------------
当c==0的时候,很明显:不按。
当c==1的时候,也很明显:(1)(2)(3)(4) 四种。
当c==2的时候,就有七种情况了:(1)[按2和3合并为1((2)(3)的情况一样)](2)(3)(1,4)(2,4)(3,4)不按(这里没有(4),因为无论如何按两下都不可能把(4)给按出来)。
当c==3的时候,所有情况都可以了(你问我为什么??像第二步一样了)。
所以这道题很容易的就搞定了。

#include<iostream>
#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;
int n,c,x;
int a[150],b[150],d[150];
long long q[150];
int t=0;
void init()
{
cin>>n>>c;
while((cin>>x)&&(x!=-1))
a[x]=1;
while((cin>>x)&&(x!=-1))
b[x]=1;
}
void haha()
{
for(int i=1;i<=n;i++)
d[i]=1;
}
bool check()
{
for(int i=1;i<=n;i++)
{
if((a[i])&&(!d[i])) return 0;
if((b[i])&&(d[i])) return 0;
}
return 1;
}
void print()
{
for(int i=1;i<=n;i++)
cout<<d[i];
cout<<endl; t++;
}
void doit1()
{
for(int i=1;i<=n;i++)
d[i]=(d[i])?0:1;
}
void doit2()
{
for(int i=1;i<=n;i+=2)
d[i]=(d[i])?0:1;
}
void doit3()
{
for(int i=2;i<=n;i+=2)
d[i]=(d[i])?0:1;
}
void doit4()
{
for(int i=1;i<=n;i+=3)
d[i]=(d[i])?0:1;
}
int main()
{
freopen("add.in","r",stdin);
freopen("add.out","w",stdout);
init();
haha();
switch(c)
{
case 0:
if(check()) print();
break;
case 1:
haha(); doit1();
if(check()) print();
haha(); doit2();
if(check()) print();
haha(); doit3();
if(check()) print();
haha(); doit4();
if(check()) print();
break;
case 2:
haha(); doit1();
if(check()) print();
haha(); doit3(); doit4();
if(check()) print();
haha(); doit2();
if(check()) print();
haha(); doit1(); doit4();
if(check()) print();
haha(); doit3();
if(check()) print();
haha(); doit2(); doit4();
if(check()) print();
haha();
if(check()) print();
break;
default:
haha(); doit1();
if(check()) print();
haha(); doit3(); doit4();
if(check()) print();
haha(); doit2();
if(check()) print();
haha();doit4();
if(check()) print();
haha(); doit1(); doit4();
if(check()) print();
haha(); doit3();
if(check()) print();
haha(); doit2(); doit4();
if(check()) print();
haha();
if(check()) print();
break;
}
if(t==0){
cout<<"IMPOSSIBLE"<<endl;
}
return 0;
}
usaco 2.2.4 生日派对灯(最近写题碰到的,虽然知道现在写这个有点晚了)的更多相关文章
- USACO 2.2 Party Lamps 派对灯 (lamps)
题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭 ...
- 【USACO 2.2.4】派对灯
[描述] 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...
- jzoj P1163 生日派对灯
在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是 ...
- 【BFS/DFS/YY】派对灯
[luogu1468]派对灯 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将 ...
- luoguP1468 派对灯 Party Lamps x
P1468 派对灯 Party Lamps 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当 ...
- 【搜索】P1468 派对灯 Party Lamps
P1468 派对灯 Party Lamps 我们来分析一下对灯的操作 1.对所有灯的,这时吧所有灯看成一个整体 2.奇偶数的操作,这时可以把每两个数看成一个循环节 3.对3X+ 1的操作,这时可以把每 ...
- POJ 1176 Party Lamps&& USACO 2.2 派对灯(搜索)
题目地址 http://poj.org/problem?id=1176 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都 ...
- luogu P1468 派对灯 Party Lamps
题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...
- P1468 派对灯 Party Lamps(BIG 模拟)
题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...
随机推荐
- AutoPostBack通过现象看本质
在做人事档案管理系统时遇到一个功能需要实现前台数据(实时)与后台进行交互,解决这个问题首先想到的是应用控件的AutoPostBack属性.本以为这个问题就这样解决了(不用javascript.jque ...
- CLR中的垃圾回收机制
CLR中采用代(generation)来作为其垃圾回收的一种机制,其唯一的目的是提升程序的性能.基予代的垃圾回收器有以下假设: ·对象越新,其生存周期越短. ·对象越老,其生存周期越长. ·回收堆的一 ...
- js中常见的问题
js中常见的问题 原文链接 1.js获取select标签选中的值 原生js var obj = document.getElementByIdx_x(”testSelect”); //定位id var ...
- DevExpress 学习使用之 SplitContainerControl
无论是 .net framework 自带还是第三方组件,使用 Split 类控件时通常其 Panel 中都会包含多个子控件,在运行时不可避免遇到因改变 splitter 位置或改变窗体大小引起的界面 ...
- Linux Tweak:交换 Caps_Lock 与 Control_R
很少使用的Caps_Lok键占据着键盘的黄金位置,不仅如此,它还经常被按错. 于是受到程序员神器HHKB启发(如图) 对于我,Linux程序员 + vimer来说: ESC取代`键,极大的方便了VIM ...
- 企业架构研究总结(39)——TOGAF架构能力框架之架构委员会和架构合规性
3. 架构委员会 正如前面所说,一个用来对架构治理策略的实现进行监督的跨组织的架构委员会是架构治理策略成功的主要要素之一.架构委员会应该能够代表所有主要干系人的需求,并且通常还需要对整个架构的审查及维 ...
- CentOS 6下安装nodejs 0.9.0(转)
确保安装了python,大部分安装失败都是由于python版本过低导致.安装之前,升级python版本,升级步骤 http://www.tomtalk.net/wiki/Python. [root@S ...
- 基于ReliefF和K-means算法的医学应用实例
基于ReliefF和K-means算法的医学应用实例 数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识.数据挖掘 (DataMiriing),指的是从大型数据库或数据 ...
- node包管理器
NPM小结 nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台.前端的可能性,从此更加具有想象空间. 随着一系列基于nodes的应用/ ...
- 一步步学习Python-django开发-Mac下搭建Python-Django环境
首先确定学习那一个版本,以之前对Python的接触,Python2.x 的版本仍然占据很大的市场.但作为初学者我还是决定学习新的版本,相信未来会逐渐转向3.x版本的. 其实搭建Python不是一件很难 ...