1. 程式人生 > >p1468 Party Lamps

p1468 Party Lamps

就是模擬。同一個開關按2下相當於沒按,那麼,如果一共按0下,就是沒按,按1下就是4個開關的1個,按2下可能相當於實際按了0下或按2下,按3下實際按了1下或3下,之後如果是奇數,相當於按1或3下,偶數相當於按0,2,4下。再看一下是否符合。資料太小根本不會超時。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include 
<map> #include <queue> #include <set> #include <cassert> #include <stack> #include <bitset> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=30,INF=0x7FFFFFFF; int getdgt(int x) { int res=0; for(;x;) {
if(x&1)++res; x/=2; } return res; } void func(int x,bitset<1010> &y) { if(x&1)y.flip(); if(x&2) { for(int i=1;i<=1000;i+=2)y[i]=!y[i]; } if(x&4) { for(int i=2;i<=1000;i+=2)y[i]=!y[i]; } if(x&8) {
for(int i=1;i<=1000;i+=3)y[i]=!y[i]; } } bool chk(bitset<1010> bt,vector<int> &x,int sta) { for(int i=0;i<x.size();++i) { if(bt[x[i]]!=sta)return 0; } return 1; } void work(int n,set<int> time,vector<int> lg,vector<int> dk) { bool ok=0; vector<string> vct; for(int i=0;i<(1<<4);++i) { if(time.find(getdgt(i))!=time.end()) { bitset<1010> bt; bt.set(); func(i,bt); if(chk(bt,lg,1)&&chk(bt,dk,0)) { ok=1; string tmp=""; for(int j=1;j<=n;++j) { tmp+=bt[j]+'0'; } vct.push_back(tmp); } } } sort(vct.begin(),vct.end()); if(ok==0)cout<<"IMPOSSIBLE"<<endl; else { for(int i=0;i<vct.size();++i) { cout<<vct[i]<<endl; } } } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { int n,cnt; cin>>n>>cnt; vector<int> lg,dk; for(;;) { int tmp; cin>>tmp; if(tmp==-1)break; else lg.push_back(tmp); } for(;;) { int tmp; cin>>tmp; if(tmp==-1)break; else dk.push_back(tmp); } //sort(lg.begin(),lg.end()); //sort(dk.begin(),dk.end()); set<int> st; if(cnt==0) { st.insert(0); work(n,st,lg,dk); } else if(cnt==1) { st.insert(1); work(n,st,lg,dk); } else if(cnt==2) { st.insert(0); st.insert(2); work(n,st,lg,dk); } else if(cnt&1) { st.insert(1); st.insert(3); work(n,st,lg,dk); } else { st.insert(0); st.insert(2); st.insert(4); work(n,st,lg,dk); } } return 0; }