[luogu1468]派对灯

题目描述

在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'。

输入输出样例

输入样例#1:

10
1
-1
7 -1
输出样例#1:

0000000000
0101010101
0110110110

说明

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

所有灯都关着

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

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

翻译来自NOCOW

USACO 2.2

试题分析:第一眼看:很暴力!但再看一眼,发现我们只需要枚举第一次的操作,然后看是否满足条件,条件分以下几种:

①变换完不满足要求 X

②变换完满足要求但最后调完会变成不满足要求的:(C-k)%2!=0

③调的次数大于C的

以二进制形式枚举1到16,每位表示这个操作用不用

              然后经过处理不合法,在用结构体排一下序(因为方便)就AC了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath> using namespace std;
const int INF = 9999999;
#define LL long long inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int N,C;
bool light[1001];
bool dark[1001];
bool cnt[1001];
int ta;
struct data{
int seq[105];
}ans[5001]; bool cmp(data a,data b){
for(int i=1;i<=N;i++){
if(a.seq[i]!=b.seq[i]) return a.seq[i]<b.seq[i];
}
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
N=read(),C=read();
int tmp;
tmp=read();
while(tmp!=-1){
light[tmp]=1;
tmp=read();
}
tmp=read();
while(tmp!=-1){
dark[tmp]=1;
tmp=read();
}
for(int i=1;i<=16;i++){
memset(cnt,1,sizeof(cnt));
int k=0;
if(i&(1<<0)){k++;for(int j=1;j<=N;j++) cnt[j]=1-cnt[j];}
if(i&(1<<1)){k++;for(int j=1;j<=N;j+=2) cnt[j]=1-cnt[j];}
if(i&(1<<2)){k++;for(int j=2;j<=N;j+=2) cnt[j]=1-cnt[j];}
if(i&(1<<3)) {k++;for(int j=0;3*j+1<=N;j++) cnt[3*j+1]=1-cnt[3*j+1];}
bool flag=true;
for(int i=1;i<=N;i++){
if(cnt[i]!=1&&light[i]==1){
flag=false;
break;
}
}
for(int i=1;i<=N;i++){
if(cnt[i]!=0&&dark[i]==1){
flag=false;
break;
}
}
if(!flag) continue;
if((C-k)%2!=0||k>C) continue;
++ta;
for(int j=1;j<=N;j++)
ans[ta].seq[j]=cnt[j];
}
if(!ta){
puts("IMPOSSIBLE");
return 0;
}
sort(ans+1,ans+ta+1,cmp);
for(int i=1;i<=ta;i++){
for(int j=1;j<=N;j++)
printf("%d",ans[i].seq[j]);
printf("\n");
}
return 0;
}

  

【BFS/DFS/YY】派对灯的更多相关文章

  1. POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)

    思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...

  2. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  3. Collect More Jewels(hdu1044)(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

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

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

  5. luoguP1468 派对灯 Party Lamps x

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

  6. Cleaning Robot (bfs+dfs)

    Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...

  7. LeetCode:BFS/DFS

    BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...

  8. BFS/DFS算法介绍与实现(转)

    广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...

  9. FZU 2150 Fire Game (bfs+dfs)

    Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board ...

随机推荐

  1. 实现拷贝函数(strcpy)

    #include <stdio.h> #include <stdlib.h> // 函数声明 char *mystrcpy(char *object, char *source ...

  2. HDU 1548 A strange lift (广搜)

    题目链接 Problem Description There is a strange lift.The lift can stop can at every floor as you want, a ...

  3. ASP.NET 简单鼠标右键效果contextmenutrip

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  4. div圆角

    div{    -moz-border-radius: 10px;    -webkit-border-radius: 10px;    border-radius: 10px;}

  5. Bower A package manager for the web

    Bower can manage components that contain HTML, CSS, JavaScript, fonts or even image files. Bower doe ...

  6. SpringBoot工程目录配置

    Spring Boot建议的目录结果如下: root package结构:com.example.myproject   com +- example +- myproject +- Applicat ...

  7. Tomcat8配置默认项目

    <!-- 配置默认访问项目 --> <Host name="localhost" appBase="webapps" unpackWARs=& ...

  8. 448D - Codeforces

    D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes Bizon the C ...

  9. swift中的如果在构造方法中使用KVC, 调用了super.init(), 报错, 基本数据类型属性找不到

    swift要求, 属性必须有初始化值, 如果不对其赋值, 可以加一个?系统会默认给其包装一个可选值(直说就是nil) 如果定义一个基本类型, 建议直接赋值, 不建议使用? 下面说下标题中的问题 有时候 ...

  10. Divide Two Integers——二分法的经典变形

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...