USACO Section2.2 Party Lamps 解题报告 【icedream61】
lamps解题报告
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
N个灯,编号1~N。有4个开关,和C次改变某个开关状态的机会,试问最终所有灯的亮灭情况可能有哪些?
一号开关:改变所有灯的状态。
二号开关:改变所有奇数号灯的状态。
三号开关:改变所有偶数号灯的状态。
四号开关:改变所有3K+1号灯的状态(k=0,1,2,…)。
初始时,所有灯都是亮的。
【输入】
第一行一个数,N。
第二行一个数,C。
后两行,每行有空格分割的一些数,以-1结尾,给出的是此题的“额外限制条件”:
第三行所出现的数,表示编号为这些的灯最终应当处于“亮”的状态,即最后输出时这些位置的数字应当为1;
第四行所出现的数,表示编号为这些的灯最终应当处于“灭”的状态,即最后输出时这些位置的数字应当为0。
【输出】
所有符合题目要求的状态,每行一种状态,用N位的二进制数来表示所有灯的亮灭状态,从最高位到最低位依次是1号到N号灯。
注意,请按照字典序输出。
【数据范围】
N=10~100
C=0~10000
【输入样例】
10
1
-1
7 -1
【输出样例】
0000000000
0101010101
0110110110
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
如果直接记录所有灯的状态,那么状态数是2的100次方种,明显超空间。
简单观察一下,这道题的灯可以分为6组,分别是除以6模0~5这六组。那么,一号开关就是6组全改变,二、三号开关则是分别改变奇数组和偶数组,四号开关则是仅仅改变3K+1对应的两组。这样一来,所有灯的状态总共只有64种。
继续分析,四个开关,一个初始状态,那么显然我们可以拨动开关0~4次,分别是一个开关都不变直到四个开关都变,就只有这五种情况了。也就是说,C的值只有0~4是有意义的,而一旦比4大,就说明必然灯被拨动了两次,那么可以让C减去2,让这个灯不被这样毫无意义的“玩”,结果显然是一样的。
至此,我们把N变成了6,C变成了0~4,这个模型显然就简单多了。那么,我们只要看看题目最后的限制条件啦~
依旧是映射到1~6号灯所代表的这6组灯上即可,因此这里便可能直接导致题目无解喽~
这就是本题的思路了,余下的就是编程实现细节,不予赘述。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
第四次AC,回顾自己这不到一个小时,我还真是“常怀懒惰之心”啊!
两天没做题了,脑子又开始懒了,静不下心来细想,做得很慢错误也多。很简单的题,做的过程中犯了几个细节错误:
1.第一次提交,把代码中main函数里第三个IMPOSSIBLE那种情况给忘了
2.第二次提交,ok函数中if语句&运算的括号没加,导致运算符优先级错误
3.第三次提交,main函数中最后一个循环并未使用kk来保证字典序输出
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/*
ID: icedrea1
PROB: lamps
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; // p[101100]: 1,2,5 closed, 3,4,6 openned
bool p[]; // p[k]: can walk to state k
bool d[]; // d[k]: state d is right
int r[],w[];
int mark[]; int N,C; void go(int k,int c) // walk c steps from state k
{
if(!c) // get a final state
{
p[k]=true;
return;
} int t;
t=k^; go(t,c-);
t=k^; go(t,c-);
t=k^; go(t,c-);
t=k^; go(t,c-);
} bool ok(int k) // return if the state is right
{
for(int i=;i!=;++i) // the lamps in group i
if(mark[i]!=- && (k&(<<i))!=(mark[i]<<i)) // the state of lamps in group i is right to mark[i]
return false;
return true;
} void print(ostream &out,int k)
{
bool t[];
for(int i=;i!=;++i) t[i]=k&(<<i);
for(int i=;i!=N;++i) out<<t[i%];
out<<endl;
} int main()
{
ifstream in("lamps.in");
ofstream out("lamps.out"); in>>N>>C; while(C>=) C-=; p[]=true;
go(,C);
int x,y;
for(int i=;i!=;++i) mark[i]=-;
for(in>>x;x!=-;in>>x)
{
y=(x-)%;
if(mark[y]==-) mark[y]=;
else if(mark[y]==)
{
out<<"IMPOSSIBLE"<<endl;
in.close(); out.close();
return ;
}
}
for(in>>x;x!=-;in>>x)
{
y=(x-)%;
if(mark[y]==-) mark[y]=;
else if(mark[y]==)
{
out<<"IMPOSSIBLE"<<endl;
in.close(); out.close();
return ;
}
}
//for(int i=0;i!=6;++i) cout<<"mark["<<i<<"]="<<mark[i]<<endl; bool t=false;
for(int kk=,k=;k!=;++k,kk=)
{
for(int i=;i!=;++i) kk+=((bool)(k&(<<i)))*(<<(-i-));
//cout<<"k= "; print(cout,k);
//cout<<"kk="; print(cout,kk);
//cout<<endl;
if(p[kk] && ok(kk)) { print(out,kk); t=true; }
}
if(!t) out<<"IMPOSSIBLE"<<endl; in.close(); out.close();
return ;
}
USACO Section2.2 Party Lamps 解题报告 【icedream61】的更多相关文章
- USACO Section2.1 The Castle 解题报告
castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- USACO Section2.1 Ordered Fractions 解题报告
frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Hamming Codes 解题报告 【icedream61】
hamming解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Controlling Companies 解题报告 【icedream61】
concom解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Money Systems 解题报告 【icedream61】
money解题报告------------------------------------------------------------------------------------------- ...
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
zerosum解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】
nocows解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- ubuntu terminal copy paste
copy: ctrl + insert paste: shift + insert
- javascript 时间格式化方法
对jquery进行扩展的方法: //对时间格式化(jquery方法扩展) Date.prototype.Format = function (fmt) { //author: meizz var o ...
- MYSQL 之SET GLOBAL innodb_buffer_pool_size =n
工作遇到一个情况是索引相同的情况下,mysql服务在linux上运行很快,在windows服务器上运行很慢,版本是V5.7以后得版本,同事查找了下说应该设置 SET GLOBAL innodb_buf ...
- Treap 实现名次树
在主流STL版本中,set,map,都是BST实现的,具体来说是一种称为红黑树的动态平衡BST: 但是在竞赛中并不常用,因为红黑树过于复杂,他的插入 5 种,删除 6 中,代码量极大(如果你要改板子的 ...
- spring依赖注入(转)
转自:https://blog.csdn.net/taijianyu/article/details/2338311/ Spring 能有效地组织J2EE应用各层的对象.不管是控 制层的Action对 ...
- 2月4号学习的一个SSM整合项目,第一课
本文引自:https://github.com/Sunybyjava/seckill 原作者:sunybyjava@gmail.com seckill 一个整合SSM框架的高并发和商品秒杀项目,学习 ...
- arraylist,list ,数组区别
https://www.cnblogs.com/a164266729/p/4561651.html
- SWFUpload 参数详解
属性 类型 默认值 描述 upload_url String 处理上传文件的服务器端页面的url地址,可以是绝对地址,也可以是相对地址,当为相对地址时相对的是当前代码所在的文档地址 preserv ...
- mingw libgcc_s_sjlj-1.dll is missing
习惯了在linux环境下工作,编译wingdows平台程序采用mingw工具.编译完,运行exe程序,弹出错误信息: libgcc_s_sjlj-1.dll is missing 百度了一下,原来是编 ...
- Search in Rotated Sorted Array——LeetCode
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...