题目描述

在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。
这些灯都连接到四个按钮:

  • 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。

  • 按钮2:当按下此按钮,将改变所有奇数号的灯。

  • 按钮3:当按下此按钮,将改变所有偶数号的灯。

  • 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7...

一个计数器C记录按钮被按下的次数。
当宴会开始,所有的灯都亮着,此时计数器C为0。
你将得到计数器C(0<=C<=10000)上的数值和经过若干操作后所有灯的状态。写一个程序去找出所有灯最后可能的与所给出信息相符的状态,并且没有重复。

输入

不会有灯会在输入中出现两次。

第一行: N。
第二行: C最后显示的数值。
第三行: 最后亮着的灯,用一个空格分开,以-1为结束。
第四行:  最后关着的灯,用一个空格分开,以-1为结束。

输出

每一行是所有灯可能的最后状态(没有重复)。每一行有N个字符,第1个字符表示1号灯,最后一个字符表示N号灯。0表示关闭,1表示亮着。这些行必须从小到大排列(看作是二进制数)。
如果没有可能的状态,则输出一行'IMPOSSIBLE'。

输入输出样例

Copy
10
1
-1
7 -1
Copy
0000000000
0101010101
0110110110

提示

在这个样例中,有10盏灯,只有1个按钮被按下。最后7号灯是关着的。

在这个样例中,有三种可能的状态:

* 所有灯都关着
    * 1,4,7,10号灯关着,2,3,5,6,8,9亮着。
    * 1,3,5,7,9号灯关着,2, 4, 6, 8, 10亮着。

开始做的时候很没思路 几欲想打dfs  然后看NOCOW("又"是Nocow) 然后发现了一个常数表的打发  我相信他讲的肯定要比我讲得好  所以先给个链接    然而我还是说一下我的理解  其实仔细看可以发现是每6个一循环的  为什么呢 ? 即gcd(1,2,2,3)    其次按2按3=按1  按1按2=按3 按1按3=按2 按1按2按3=不按.......(以下省略)    这之后把所有的情况用一个常数表保存起来  最后遍历一遍 对他给出确定的按或不按的灯再到这个常数表里看是否吻合  然后就是一些边界的考虑了  再者我这个代码在usaco里是可以a的  但yzoi总是有一个点过不去(什么坑爹数据......)

有图为证:

代码如下:

/*
ID:laphets
PROG:lamps
LANG:C++
*/ #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=10000+10;
int n,c,x,tmp;
int data[maxn];
int cnt1,cnt2; int light[9][7]=
{
0,0,0,0,0,0,0,
0,0,0,0,0,0,0, //push 1
0,0,0,1,1,1,0, //push 1 and 4
0,0,1,0,1,0,1, //push 3
0,0,1,1,0,1,1, //push 1 and 4
0,1,0,0,1,0,0, //push 4
0,1,0,1,0,1,0, //push 2
0,1,1,0,0,0,1, //push 2 and 4
0,1,1,1,1,1,1, //no push
}; int minmum[9]={0,1,2,1,2,1,1,2,0}; int main()
{
// freopen("1.sb","r",stdin);
freopen("lamps.in","r",stdin);
freopen("lamps.out","w",stdout);
cin>>n>>c;
memset(data,-1,sizeof(data));
while(cin>>x&&x!=-1)
data[x]=1,cnt1++;
while(cin>>x&&x!=-1)
data[x]=0,cnt2++;
if(c==0)
{
if(cnt1==n)
{
while(n--)
cout<<0;
cout<<endl;
return 0;
}
if(cnt2==0)
{
while(n--)
cout<<1;
cout<<endl;
return 0;
}
if(cnt2!=0)
{
cout<<"IMPOSSIBLE"<<endl;
return 0;
}
}
if(cnt1==n)
{
while(n--)
cout<<0;
cout<<endl;
return 0;
}
bool flag1=false;
for(int i=1;i<=8;i++)
{
bool flag2=true;
for(int j=1;j<=n;j++)
{
if(data[j]==-1)
continue;
tmp=j%6;
if(tmp==0)
tmp=6;
if(data[j]!=light[i][tmp])
{
flag2=false;
break;
}
} if(flag2==true&&c>minmum[i])
{
// cout<<1<<endl;
flag1=true;
for(int j=1;j<=n;j++)
{
tmp=j%6;
if(tmp==0)
tmp=6;
cout<<light[i][tmp];
}
cout<<endl;
}
}
if(flag1==false)
cout<<"IMPOSSIBLE"<<endl;
return 0;
}

USACO 2.2 Party Lamps 派对灯 (lamps)的更多相关文章

  1. 【USACO 2.2.4】派对灯

    [描述] 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...

  2. usaco 2.2.4 生日派对灯(最近写题碰到的,虽然知道现在写这个有点晚了)

    经过分析,他看似很多的开灯的方法其实合并起来就只有八个. 首先,一个开关在执行的时候只能按一次(因为你就算按了两次就相当于一次也没有按). 当一个都不按的时候  当然就只有一种:不按. 当按一下的时候 ...

  3. luoguP1468 派对灯 Party Lamps x

    P1468 派对灯 Party Lamps 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当 ...

  4. 【搜索】P1468 派对灯 Party Lamps

    P1468 派对灯 Party Lamps 我们来分析一下对灯的操作 1.对所有灯的,这时吧所有灯看成一个整体 2.奇偶数的操作,这时可以把每两个数看成一个循环节 3.对3X+ 1的操作,这时可以把每 ...

  5. 【BFS/DFS/YY】派对灯

    [luogu1468]派对灯 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将 ...

  6. POJ 1176 Party Lamps&& USACO 2.2 派对灯(搜索)

    题目地址 http://poj.org/problem?id=1176 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都 ...

  7. luogu P1468 派对灯 Party Lamps

    题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...

  8. P1468 派对灯 Party Lamps(BIG 模拟)

    题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...

  9. jzoj P1163 生日派对灯

    在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮:  按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是 ...

随机推荐

  1. Linux I2C设备驱动编写(一)

    在Linux驱动中I2C系统中主要包含以下几个成员: I2C adapter 即I2C适配器 I2C driver 某个I2C设备的设备驱动,可以以driver理解. I2C client 某个I2C ...

  2. HW4.27

    public class Solution { public static void main(String[] args) { int count = 0; for(int i = 2001; i ...

  3. 【ACM/ICPC2013】线段树题目集合(一)

    前言:前一段时间在网上找了一个线段树题目列表,我顺着做了一些,今天我把做过的整理一下.感觉自己对线段树了解的还不是很深,自己的算法能力还要加强.光练代码能力还是不够的,要多思考.向队友学习,向大牛学习 ...

  4. PC-修改IE 与 禁止修改IE

    1.注册表编辑器1.1在Windows启动后1.2点击“开始”1.3“运行”菜单项1.4在“打开”栏中键入“regedit”1.5然后按“确定”键 2.首页项2.1展开注册表到“HKEY_LOCAL_ ...

  5. linux系统垃圾清理

    早上刚来,服务器出502错误了.我登上linux服务器,发现敲一个命令都提示没空间了, 用 df -h 查看了下 发现系统盘目录空间大小占用达到90%多,我觉得有些诧异, 难道是产生系统垃圾 然后用 ...

  6. 利用WinDriver开发PCI设备驱动程序

    摘要 WinDriver是Jungo公司出版的一个设备驱动程序开发组件,它可以大大加速PCI设备驱动程序的开发.作者在实际的项目中采用了WinDriver来开发设备驱动程序,取得了相当好的运行效果.从 ...

  7. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS

    TypeScript outputs JavaScript, but what are you supposed to do with it? This lesson shows how to tak ...

  8. 基于单个 div 的 CSS 画图

    原文: Single Div Drawings with CSS 译文: 基于单个 div 的 CSS 画图 译者: 前端外刊评论 译注:通读本文,强烈地感受到了技术与艺术的结合.赞作者的这句话:Re ...

  9. 节点类(CCNode)

    节点与渲染树 回顾前面的介绍,我们已经知道了精灵.层和场景如何构成一个游戏的框架.精灵属于层,层属于场景,玩家与精灵互动,并导致游戏画面在不同场景中切换.把每个环节拼接在一起,我们得到了一个完整的关系 ...

  10. android线程与线程池-----线程池(二)《android开发艺术与探索》

    android 中的线程池 线程池的优点: 1 重用线程池中的线程,避免了线程的创建和销毁带来的性能开销 2 能有效的控制最大并发数,避免大量线程之间因为喜欢抢资源而导致阻塞 3 能够对线程进行简单的 ...