标签:
好开心啊,一次AC!!
看到题目开始脑补同余方程hhh……
实际上这道题目就是奇偶性的问题,考虑到C辣么大,所以这道题肯定要换个角度啦.
那么我们假设四个button为ABCD四种情况,
并且只考虑他们的奇偶性,即0或1
如果他们满足下列条件即可:
1)之和与常数C的奇偶性相同
2)对应的最后一位所要求的奇偶性相同
3)之和小于等于常数C
对于第三条有必要注意,因为常数C可能会很小,以至于取不到完整的非负整数,所以一定需要第三条限制。
于是就很愉快的解决了算法的问题。
可惜的是,C++就是那么不给力。
由于需要按照字典序,所以我要给他们排序,可是用string会废,用char又不能用sort,反正C++的字符串特别奇怪,至今我还是没搞懂怎么办。
所以最后还是先用手写冒泡了。
1 /*************************************** 2 Problem POJ 1176 3 Status Accepted 4 Memory 708KB 5 Time 0MS 6 Date 2015-06-06 7 By JimmyLin 8 ***************************************/ 9 #include<iostream> 10 #include<cstdio> 11 #include<algorithm> 12 #include<string> 13 #include<cstring> 14 using namespace std; 15 16 int main() 17 { 18 int N,C; 19 cin>>N; 20 cin>>C; 21 int k; 22 int a[3],b[3]; 23 char ans[200][200]; 24 int anstot=0; 25 int at=0,bt=0; 26 while(scanf("%d",&k)==1&&k!=-1)a[++at]=k; 27 while(scanf("%d",&k)==1&&k!=-1)b[++bt]=k; 28 for(int aa=0;aa<=1;aa++) 29 for(int bb=0;bb<=1;bb++) 30 for(int cc=0;cc<=1;cc++) 31 for(int dd=0;dd<=1;dd++){ 32 if(aa+bb+cc+dd<=C&&(aa+bb+cc+dd)%2==C%2){ 33 bool f=true; 34 for(int i=1;i<=at;i++){ 35 int p=aa; 36 if(a[i]%2==0)p+=cc; 37 else p+=bb; 38 if(a[i]%3==1)p+=dd; 39 if(p%2!=0)f=false; 40 } 41 for(int i=1;i<=bt;i++){ 42 int p=aa; 43 if(b[i]%2==0)p+=cc; 44 else p+=bb; 45 if(b[i]%3==1)p+=dd; 46 if(p%2!=1)f=false; 47 } 48 if(f){ 49 anstot++; 50 for(int i=1;i<=N;i++){ 51 int p=aa; 52 if(i%2==0)p+=cc; 53 else p+=bb; 54 if(i%3==1)p+=dd; 55 if(p%2==0)ans[anstot][i-1]=‘1‘; 56 else ans[anstot][i-1]=‘0‘; 57 } 58 /*for(int i=0;i<N;i++)cout<<ans[anstot][i]; 59 cout<<‘ ‘<<aa<<‘ ‘<<bb<<‘ ‘<<cc<<‘ ‘<<dd<<endl; 60 */ 61 } 62 } 63 } 64 for(int k=N-1;k>=0;k--) 65 for(int i=1;i<anstot;i++) 66 for(int j=anstot;j>i;j--)if(ans[j][k]<ans[j-1][k])swap(ans[j],ans[j-1]); 67 for(int i=1;i<=anstot;i++){ 68 for(int j=0;j<N;j++)cout<<ans[i][j]; 69 cout<<endl; 70 } 71 return 0; 72 }
标签:
原文地址:http://www.cnblogs.com/happyJimmyLin/p/4557363.html