bzoj1923[Sdoi2010]外星千足虫

bzoj1923[Sdoi2010]外星千足虫

题意:

n只两种动物,一种有奇数只脚,另一种偶数只角。现在进行m次操作,每次告诉你若干只动物的脚数之和为奇数还是偶数。要求你输出所有动物的类型以及最少多少次操作就能判断。n≤1000,m≤10000

题解:

设放进去的动物的系数为1,没放的系数为0,脚数如果是奇数结果就为1,偶数结果为0,解异或方程,具体看代码。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <bitset>
 5 #define inc(i,j,k) for(int i=j;i<=k;i++)
 6 #define maxn 1010
 7 using namespace std;
 8 
 9 bitset <maxn> M[maxn*2]; int n,m,ans; char s[maxn];
10 void gause(){
11     int now=0,pos;
12     inc(i,1,n){
13         for(pos=now+1;pos<=m&&!M[pos][i];pos++); if(pos==m+1){ans=-1; return;}else ans=max(ans,pos);
14         now++; swap(M[now],M[pos]); inc(j,1,m)if(j!=now&&M[j][i])M[j]^=M[now];
15     }
16 }
17 int main(){
18     scanf("%d%d",&n,&m);
19     inc(i,1,m){scanf("%s",s+1); inc(j,1,n)M[i][j]=s[j]-'0'; int a; scanf("%d",&a); M[i][n+1]=a;}
20     gause();
21     if(ans==-1)printf("Cannot Determine");else{
22         printf("%d\n",ans); inc(i,1,n)printf(M[i][n+1]?"?y7M#\n":"Earth\n");
23     }
24     return 0;
25 }

 

20160616

posted @ 2016-08-17 14:26  YuanZiming  阅读(175)  评论(0编辑  收藏  举报