POJ1176

好开心啊,一次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 }

 

posted @ 2015-06-06 21:47  JimmyLin^_^  阅读(301)  评论(0编辑  收藏  举报