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解题报告------------------------------------------------------------------------------------------ ...
随机推荐
- 利用批处理结合Msbuild实现快速编译
我们经常在用vs2005做项目的时候会把一个项目分成几个模块(不管是对于功能上,还是系统构架上面),为的是以后部署,还有修改维护时候的方便.这样就会带来一个问题,随着模块的增加(这里所说得每个模块就是 ...
- 前端高质量知识(一)-JS内存空间详细图解
变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所 ...
- cocos2d-x 3.0 创建项目
cocos2d-x 3.0 创建项目 点击打开链接
- 2018.7.27 Json与Java相互转换
Json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- app上线
不管第一次还是第二次APP上线都需要三样东西:开发者证书,appID,描述文件
- arraylist,list ,数组区别
https://www.cnblogs.com/a164266729/p/4561651.html
- ZooKeeper 完全分布式集群环境搭建
1. 搭建前准备 示例共三台主机,主机IP映射信息如下: 192.168.32.101 s1 192.168.32.102 s2 192.168.32.103 s3 2.下载ZooKeeper, 以 ...
- 14 - Log日志
LOG https://www.cnblogs.com/yyds/p/6901864.html logging logging模块提供模块级别的函数记录日志 包括四大组件 1.日志相关概念 日志的级别 ...
- react(一):组件的生命周期
最近兄弟团队让我去帮忙优化两个页面,前端用的react全家桶,后端用的python,上一次写react代码都过去一年了,顺着以前的的学习思路,再捋顺一下react的要点 组件的生命周期就是Reac的工 ...
- DECODE函数简介
在上一篇bolg中讲到ORACLE优化的时候提到DECODE()函数,以前自己用的也比较少,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! https://www.cnblogs.co ...