zoukankan      html  css  js  c++  java
  • 1923: [Sdoi2010]外星千足虫

    1923: [Sdoi2010]外星千足虫

    Time Limit: 10 Sec  Memory Limit: 64 MB
    Submit: 1312  Solved: 841
    [Submit][Status][Discuss]

    Description

    Input

    第一行是两个正整数 N, M。 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果。每行 包含一个“01”串和一个数字,用一个空格隔开。“01”串按位依次表示每只虫 子是否被放入机器:如果第 i 个字符是“0”则代表编号为 i 的虫子未被放入,“1” 则代表已被放入。后面跟的数字是统计的昆虫足数 mod 2 的结果。 由于 NASA的实验机器精确无误,保证前后数据不会自相矛盾。即给定数据 一定有解。

    Output

    在给定数据存在唯一解时有 N+1行,第一行输出一个不 超过M的正整数K,表明在第K 次统计结束后就可以确定唯一解;接下来 N 行 依次回答每只千足虫的身份,若是奇数条足则输出“?y7M#”(火星文),偶数 条足输出“Earth”。如果输入数据存在多解,输出“Cannot Determine”。 所有输出均不含引号,输出时请注意大小写。

    Sample Input

    3 5
    011 1
    110 1
    101 0
    111 1
    010 1

    Sample Output

    4
    Earth
    ?y7M#
    Earth

    HINT

    对于 20%的数据,满足 N=M≤20; 
    对于 40%的数据,满足 N=M≤500; 
    对于 70%的数据,满足 N≤500,M≤1,000; 
    对于 100%的数据,满足 N≤1,000,M≤2,000。 

    分析

    用高斯消元解异或方程组。把矩阵变成上三角矩阵后,求解。

    设第i个虫子$x_i$,那么如果是地球虫$x_i=0$,外星虫$x_i=1$。

    $ a_1x_1 $^ $a_2x_2 $^... ^ $a_nx_n = b $

    一共有m个方程。

    code

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<bitset>
     4 using namespace std;
     5 const int N = 2010;
     6 int n,m,ans;
     7 char s[N];
     8 bitset<N> a[N];
     9 
    10 bool Gauss() {
    11     for (int k=1; k<=n; ++k) {
    12         int r = k;
    13         while (!a[r][k] && r<=m) r++;
    14         if (r == m+1) return false;
    15         ans = max(ans,r);
    16         if (r != k) swap(a[r],a[k]);
    17         for (int i=1; i<=m; ++i) {
    18             if (i != k && a[i][k]) a[i] ^= a[k];
    19         }
    20     }
    21     return true;
    22 }
    23 int main () {
    24     scanf("%d%d",&n,&m);
    25     for (int x,i=1; i<=m; ++i) {
    26         scanf("%s%d",s,&x);
    27         for (int j=0; j<n; ++j) a[i][j+1] = s[j] - '0';
    28         a[i][n+1] = x;
    29     }
    30     if (Gauss()) {
    31         printf("%d
    ",ans);
    32         for (int i=1; i<=n; ++i) {
    33             if (a[i][n+1]) puts("?y7M#");
    34             else puts("Earth");
    35         }
    36     }
    37     else puts("Cannot Determine");
    38     return 0;
    39 }
    bitset
     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 const int N = 2010;
     6 int a[N][N],n,m,ans;
     7 char s[N];
     8 
     9 bool Gauss() {
    10     for (int k=1; k<=n; ++k) {
    11         int r = k;
    12         while (!a[r][k] && r<=m) r++;
    13         if (r == m+1) return false;
    14         ans = max(ans,r);
    15         if (r != k) for (int j=1; j<=n+1; ++j) swap(a[r][j],a[k][j]);
    16         for (int i=1; i<=m; ++i) {
    17             if (i != k && a[i][k]) 
    18                 for (int j=k; j<=n+1; ++j) a[i][j] ^= a[k][j]; 
    19         }
    20     }
    21     return true;
    22 }
    23 int main () {
    24     scanf("%d%d",&n,&m);
    25     for (int x,i=1; i<=m; ++i) {
    26         scanf("%s%d",s,&x);
    27         for (int j=0; j<n; ++j) a[i][j+1] = s[j] - '0';
    28         a[i][n+1] = x;
    29     }
    30     if (Gauss()) {
    31         printf("%d
    ",ans);
    32         for (int i=1; i<=n; ++i) {
    33             if (a[i][n+1]) puts("?y7M#");
    34             else puts("Earth");
    35         }
    36     }
    37     else puts("Cannot Determine");
    38     return 0;
    39 }
    数组
  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8426808.html
Copyright © 2011-2022 走看看