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解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- 快算24点,POJ(3983)
题目链接:http://poj.org/problem?id=3983 中文题,就不解释题意了. 类似之前的一篇博客,这里也不上解释了,直接上代码吧. #include <iostream> ...
- Java从入门到放弃——04.数组
本文目标 数组 1.数组 定义一个数组的三个姿势: 数组类型 [] 数组名 = new 数组类型[数组数量]: 数组类型 [] 数组名 = new 数组类型[]{对象1 ...
- redis hash类型
- Ubuntu搜狗输入法无法输入中文等问题
Linux版本的搜狗输入法经常崩溃,无法输入中文,今天作下记录,环境:Ubuntu14.04 64位 1.安装和卸载 Linux搜狗是基于框架fcitx的,先得安装框架Ubunt安装搜狗方法 也可以直 ...
- sql的where条件转换成mongdb筛选条件
解析字符串 filterModel1 and filterModel2 and (filterModel3 or filterModel4) 1.转换成mongo的筛选条件 /// <summa ...
- 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)
转载请标明出处: 首发于:https://www.fangzhipeng.com/springcloud/2017/07/12/sc12-hystix-dashbd/ 本文出自方志朋的博客 最新Fin ...
- util.Date与sql.Date转换
一. 时间类型 1. sql包下, Date:只有年月日. Time:只有时分秒. Timestamp:表示时间戳,有年月日时分秒,以及毫秒. 2. util包下, Date是sql包下三种时间类 ...
- 使用winsw将spring-boot jar包注册成windows服务
背景:最近的项目中使用spring-boot, https://github.com/kohsuke/winsw/releases <service> <id>YJPSS< ...
- BZOJ1046: [HAOI2007]上升序列(LIS)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5740 Solved: 2025[Submit][Status][Discuss] Descript ...
- 【经典问题】bzoj2957: 楼房重建
经典问题:动态维护上升子序列长度 进阶问题:[经典问题]#176. 栈 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无 ...