洛谷 P1468 派对灯 Party Lamps
2017-10-15 10:22
197 查看
题目描述
在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
在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
//bitset 瞎搞 五十分 //观察可以发现 答案必定是6个字符一循环 具体的去网上找吧,手懒..... #include<iostream> #include<cstring> #include<cstdio> #include<sstream> #include<fstream> #include<algorithm> #include<bitset> using namespace std; int N , C,Ans = 0, a[101] = {0}, b[101] = {0}; string str[17]; bitset<101> bit(0); /* bit.flip() 将bit的所有二进制位 按位取反 bit.flip(pos) 将bit的pos位处的二进制位 按位取反 */ bool Judge(string &s){ int r = 0; while(a[r] != -1) if(s[a[r++] - 1 ] == '0') return false; r = 0; while(b[r] != -1) if(s[b[r++] - 1 ] == '0') return false; return true; } void Change(int f,bitset<101> &bit){ switch(f) { case 0 : for(int i=0; i<N; ++i) bit.flip(i); break; case 1 : for(int i=0; i<N; i+=2) bit.flip(i); break; case 2 : for(int i=1; i<N; i+=2) bit.flip(i); break; case 3 : for(int i=0; i<N; i+=3) bit.flip(i); break; } } int main(int argc,char *argv[]){ int r = 0; cin >> N >> C; while(cin >> a[r]) if(a[r++] == -1) break; r = 0; while(cin >> b[r]) if(b[r++] == -1) break; for(int i=0; i<=15; ++i){ bit.set(); bitset<4> t(i); if((t.count() % 2 == C % 2) && (t.count() <= C)){ stringstream s; string ts; for(int j=0; j<4; ++j) if(t[j]) Change(j,bit); for(int j=0; j<N; ++j) s << bit[j]; s >> ts; if(Judge(ts)) str[Ans++] = ts; } } sort(str,str+Ans); for(int i=0; i<Ans; ++i) cout << str[i] <<endl; if(!Ans) printf("IMPOSSIBLE\n"); return 0; }
//模拟+搜索 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define MAXN 101 using namespace std; int l[MAXN],d[MAXN],q[110],f,h,c,llz = 0,n; int u[10] = {0,3,0,0,1,0,2,0}; int v[10] = {1,4,2,4,4,3,4,0}; void Add(int x){ if(x == 0) return; else if(x==1) for(int i=1;i<=n;i++) q[i]^=1; else if(x==3) for(int i=2;i<=n;i fc8d +=2) q[i]^=1; else if(x==2) for(int i=1;i<=n;i+=2) q[i]^=1; else if(x==4) for(int i=1;i<=n;i+=3) q[i]^=1; } void DFS(int x){ int z = 0,cn = 7; if(x == 1){ cn = 3; memset(u, 0, sizeof u ); for(int i=1; i<=n; ++i) v[i] = i + 1; } for(int j=z; j<=cn; ++j){ Add(u[j]),Add(v[j]); bool flag = 0; for(int i=1; i<=f; ++i) if(q[l[i]] == 0){ flag = 1; break; } for(int i=1; i<=h; ++i) if(q[d[i]] == 1){ flag = 1; break; } if(!flag) { if(llz) printf("\n"); for(int i=1; i<=n; ++i) printf("%d",q[i]); llz = 1; } Add(u[j]),Add(v[j]); } } int main(int argc,char *argv[]){ scanf("%d%d",&n,&c); int x; while(1){ scanf("%d",&x); if(x == -1) break; l[++f] = x; } while(1){ scanf("%d",&x); if(x == -1) break; d[++h] = x; } for(int i=1; i<=n; ++i) q[i] = 1; if(c == 0){ bool flag = 0; for(int i=1; i<=f; ++i) if(q[l[i] == 0]){ flag = 1; break; } for(int i=1; i<=h; ++i) if(q[d[i] == 1]){ flag = 1; break; } if(!flag) { if(llz) printf("\n"); for(int i=1; i<=n; ++i) printf("%d",q[i]); llz = 1; } } else DFS(c); if(llz == 0) printf("IMPOSSIBLE\n"); return 0; }
相关文章推荐
- 洛谷P1468 派对灯 Party Lamps
- USACO 2.2 Party Lamps 派对灯 (lamps)
- 洛谷P3068 [USACO13JAN]派对邀请函Party Invitations
- luogu P1468 派对灯 Party Lamps
- 洛谷 P1265 公路修建
- 灾后重建 洛谷p1119
- 洛谷 [NOIP2012 D1T2] P1080 国王游戏
- 洛谷1563 玩具谜题
- 洛谷P1120小木棍[DFS]
- 洛谷P1132 数字生成游戏
- [洛谷P1462]通往奥格瑞玛的道路
- 洛谷P1313 计算系数
- 洛谷 P1414 又是毕业季II
- 洛谷P1368 均分纸牌(加强版)
- POJ 1176 - Party Lamps
- 洛谷1099 树网的核
- 【洛谷 2024】[NOI2001]食物链
- 洛谷 P1712 区间
- 洛谷P1061 Jam的计数法
- 洛谷p1541乌龟棋