http://ac.jobdu.com/problem.php?pid=1402 特殊的数
#include<iostream> #include<bitset> #include<cstdio> using namespace std; void read(int &data) //快速读取数据 { char ch = getchar(); while (ch < '0' || ch > '9') ch = getchar(); data = 0; do { data = data*10 + ch-'0'; ch = getchar(); }while (ch >= '0' && ch <= '9'); } int main(void) { int n,i,m,max,num,min; bitset<1000001> bits,b; while(scanf("%d",&n)!=EOF) { bits.reset(); //清空 b.reset(); max=-1; min=1000001; for(i=0;i<n;i++) { //scanf("%d",&m); read(m); if(m>max) max=m; if(m<min) min=m; if(bits[m]==0) //这个数字第一次出现 bits[m]=1; else if(bits[m]==1 && b[m]==0) //这个数字第二次出现 b[m]=1; //超过两次以上出现的数字不用在进行赋值操作了 } num=0; for(i=min;i<=max;i++) { if(bits[i]==1 && !b[i]) //只出现了一次 num++; } //num=bits.count()-b.count(); printf("%d\n",num); if(num) { m=0; for(i=min;i<=max;i++) { if(b[i]==0 && bits[i]==1) { if(m==0) { printf("%d",i); m++; } else { printf(" %d",i); m++; } if(m==num) { printf("\n"); break; } } } } } return 0; }
http://ac.jobdu.com/problem.php?pid=1403 神奇的开关 http://poj.org/problem?id=1176
#include<iostream> #include<queue> #include<cstdio> #include<string> #include<set> using namespace std; #include<memory.h> struct node { string name; //定义一个优先队列 friend bool operator<(node a,node b) { return a.name > b.name; //小到大(字典序) } }w; string str; priority_queue<node > q; set<string>myset; int ON[101],OFF[101],n,i,j,k,p,r,t; bool pos[101]; inline void solve() { int h; if(i) memset(pos,false,sizeof(pos)); else //开 memset(pos,true,sizeof(pos)); if(j) //奇数的灯改变状态 { for(h=1;h<=n;h+=2) pos[h] ^=1; //跟 pos[h] =1- pos[h]; 是等效的 } if(k) //偶数的灯改变状态 { for(h=1;h<=n;h++) { if((h&1)==0) //由于==的优先级比与运算的优先级别要高,所以与运算需要加括号,导致了多次WA pos[h] ^=1; } } if(p) //编号为(3 * K + 1)(K>=0)的灯改变状态 { for(h=1;h<=n;h+=3) { if(h%3==1) pos[h] ^=1; } } for(h=0;h<r;h++) { if(!pos[ON[h]]) return ; } for(h=0;h<t;h++) { if(pos[OFF[h]]) return ; } str=""; for(h=1;h<=n;h++) { if(pos[h]) str+='1'; else str+='0'; } myset.insert(str); } int main(void) { int c,m; set<string>::iterator iter; while(scanf("%d",&n)!=EOF) { myset.clear(); scanf("%d",&c); r=t=0; while(1) { scanf("%d",&m); if(m==-1) break; ON[r++]=m; } while(1) { scanf("%d",&m); if(m==-1) break; OFF[t++]=m; } for(i=0;i<=1;i++) //枚举状态 { for(j=0;j<=1;j++) { for(k=0;k<=1;k++) { for(p=0;p<=1;p++) { if(i+j+k+p>c) break; if ((i+j+k+p)%2!=c%2) continue; solve(); } } } } if(myset.empty()) printf("IMPOSSIBLE\n"); else { for(iter=myset.begin();iter!=myset.end();iter++) cout<<*iter<<endl; } } return 0; }