zoukankan      html  css  js  c++  java
  • 【BZOJ-1923】外星千足虫 高斯消元 + xor方程组

    1923: [Sdoi2010]外星千足虫

    Time Limit: 10 Sec  Memory Limit: 64 MB
    Submit: 766  Solved: 485
    [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。

    ==========================================================
    请不要提交!

    Source

    第一轮Day1

    Solution

    题目描述非常清晰,就是给出一些方程,解方程组

    一般解方程类型的题目通用的方式:高斯消元硬解/转化模型利用最短路/转化模型利用网络流

    后面两种并没怎么接触过,所以这里只能考虑高斯消元硬解,把解一般方程组改成异或就好了..

    这里学习了bitset的部分技巧,其实还不是很熟练,以后再看看bitset

    Code

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<bitset>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    bitset <1005> A[2010];
    int B[2010],n,m,ans;
    char s[2010];
    int Gauss()
    {
        for (int i=1; i<=n; i++)
            {
                int j=i;
                while (j<=m && !A[j][i]) j++;
                if (j==m+1) return 0;
                ans=max(ans,j);
                swap(A[i],A[j]);
                for (int k=1; k<=m; k++)
                    if (i!=k && A[k][i])
                        A[k]^=A[i];
            }
        return 1;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1; i<=m; i++)
            {
                scanf("%s%d",s,&B[i]);
                for (int j=0; j<=n-1; j++) A[i][j+1]=s[j]-'0';
                A[i][n+1]=B[i];
            }
        int OK=Gauss();
        if (!OK) {puts("Cannot Determine"); return 0;}
        printf("%d
    ",ans);
        for (int i=1; i<=n; i++)
            if (A[i][n+1]) puts("?y7M#");
                else puts("Earth");
        return 0;
    }
  • 相关阅读:
    Servlet 易错点和注意点
    Spring 完成自动注入(autowire)
    Java 定时调度Timer&Quartz
    常用Linux命令杂记
    Spring 使用AOP——基于注解配置
    Spring 使用AOP——xml配置
    Spring 使用纯注解方式完成IoC
    Spring 简单使用IoC与DI——XML配置
    让多个HTML页面 使用 同一段HTML代码
    Feture、ListenableFuture、ComplatableFuture
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5575935.html
Copyright © 2011-2022 走看看