STL快速解题

来源:互联网 发布:metro软件 编辑:程序博客网 时间:2024/05/12 19:16

 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)    //由于==的优先级比与运算的优先级别要高,所以与运算需要加括号,导致了多次WApos[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';elsestr+='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;}


 

原创粉丝点击