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】的更多相关文章

  1. USACO Section2.1 The Castle 解题报告

    castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  2. USACO Section2.1 Ordered Fractions 解题报告

    frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  3. USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】

    holstein解题报告 --------------------------------------------------------------------------------------- ...

  4. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告----------------------------------------------------------------------------------------- ...

  5. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告----------------------------------------------------------------------------------------- ...

  6. USACO Section2.3 Controlling Companies 解题报告 【icedream61】

    concom解题报告------------------------------------------------------------------------------------------ ...

  7. USACO Section2.3 Money Systems 解题报告 【icedream61】

    money解题报告------------------------------------------------------------------------------------------- ...

  8. USACO Section2.3 Zero Sum 解题报告 【icedream61】

    zerosum解题报告----------------------------------------------------------------------------------------- ...

  9. USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】

    nocows解题报告------------------------------------------------------------------------------------------ ...

随机推荐

  1. 利用批处理结合Msbuild实现快速编译

    我们经常在用vs2005做项目的时候会把一个项目分成几个模块(不管是对于功能上,还是系统构架上面),为的是以后部署,还有修改维护时候的方便.这样就会带来一个问题,随着模块的增加(这里所说得每个模块就是 ...

  2. 前端高质量知识(一)-JS内存空间详细图解

    变量对象与堆内存   var a = 20;   var b = 'abc';   var c = true;   var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所 ...

  3. cocos2d-x 3.0 创建项目

    cocos2d-x 3.0 创建项目  点击打开链接

  4. 2018.7.27 Json与Java相互转换

    Json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  5. app上线

    不管第一次还是第二次APP上线都需要三样东西:开发者证书,appID,描述文件

  6. arraylist,list ,数组区别

    https://www.cnblogs.com/a164266729/p/4561651.html

  7. ZooKeeper 完全分布式集群环境搭建

    1. 搭建前准备 示例共三台主机,主机IP映射信息如下: 192.168.32.101 s1 192.168.32.102 s2 192.168.32.103 s3 2.下载ZooKeeper, 以  ...

  8. 14 - Log日志

    LOG https://www.cnblogs.com/yyds/p/6901864.html logging logging模块提供模块级别的函数记录日志 包括四大组件 1.日志相关概念 日志的级别 ...

  9. react(一):组件的生命周期

    最近兄弟团队让我去帮忙优化两个页面,前端用的react全家桶,后端用的python,上一次写react代码都过去一年了,顺着以前的的学习思路,再捋顺一下react的要点 组件的生命周期就是Reac的工 ...

  10. DECODE函数简介

    在上一篇bolg中讲到ORACLE优化的时候提到DECODE()函数,以前自己用的也比较少,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! https://www.cnblogs.co ...