• POJ 2947 2947 Widget Factory 高斯消元


    给出组件的数量n,给出记录的数量m(n就是变元数量,m是方程数量)。每一个记录代表一个方程,求每个组件的生产天数。

    高斯消元即可

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <map>
    #include <string>
    using namespace std;
    
    const int MOD = 7;
    const int MAXN = 310;
    int a[MAXN][MAXN], x[MAXN];
    
    void debug(int n, int m)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
                printf("%d ", a[i][j]);
            printf("  %d
    ", a[i][m]);
        }
        puts("**************************************************************");
    }
    
    int gcd(int a,int b)               //递归算法
    {
        return b ? gcd(b, a%b) : a;
    }
    
    int lcm(int a, int b)
    {
        return a*b/gcd(a,b);
    }
    
    int Guass(int equ,int var)
    {
    //    debug(equ, var);
        int row,col;
        row=col=0;
        while(row<equ && col<var)
        {
            //列非零主
            int r=row;
            for(int i=row; i<equ; i++)
                if(a[i][col]!=0)
                {
                    r=i;
                    break;
                }
            if(r!=row)
            {
                for(int j=col; j<var+1; j++)
                    swap(a[row][j],a[r][j]);
            }
            if(a[row][col]==0)//说明有自由变元
            {
                col++;
                continue;
            }
            //消元
            for(int i=row+1; i<equ; i++)
            {
                if(a[i][col]==0) continue;
                int l = lcm(a[row][col],a[i][col]);
                int ta = l/a[row][col];
                int tb = l/a[i][col];
                for(int j=col; j<var+1; j++)
                    a[i][j] = ((tb*a[i][j] - ta*a[row][j]) % MOD + MOD) %MOD;
            }
    //        debug(equ, var);
            row++;
            col++;
        }
        for(int i=row; i<equ; i++)
            if(a[i][var]!=0) return -1;
        if(row < var) return 1;
        for(int i=row-1; i>=0; i--)
        {
            int tmp = a[i][var];
            for(int j=i+1; j<var; j++)
                tmp = ((tmp - x[j]*a[i][j])%MOD + MOD)%MOD;
            while(tmp%a[i][i]) tmp += MOD;
            x[i] = tmp/a[i][i]%MOD;
        }
        return 0;
    }
    
    int main()
    {
    //    freopen("in.txt", "r", stdin);
        int n,m;
        map<string, int>mp;
        mp["MON"] = 1, mp["TUE"] = 2, mp["WED"] = 3;
        mp["THU"] = 4, mp["FRI"] = 5, mp["SAT"] = 6, mp["SUN"] = 7;
        while(~scanf("%d%d", &n, &m))   //n个变元,m个方程
        {
            memset(a, 0, sizeof(a));
            if(n == 0 && m == 0) break;
            for(int i=0; i<m; i++)
            {
                int k;
                char s1[5], s2[5];
                scanf("%d", &k);
                scanf("%s%s", s1, s2);
                a[i][n] = (mp[s2]-mp[s1]+1+MOD)%MOD;
                while(k--)
                {
                    int t;
                    scanf("%d", &t);
                    a[i][t-1]++;
                    a[i][t-1] %= MOD;
                }
            }
            int res = Guass(m, n);
            if(res == -1)
                puts("Inconsistent data.");
            else if(res == 1)
                puts("Multiple solutions.");
            else
            {
                for(int i=0; i<n; i++)
                    if(x[i]<3) x[i] += MOD;
                for(int i=0; i<n; i++)
                    printf("%d%c", x[i], i==n-1?'
    ':' ');
            }
        }
        return 0;
    }
  • 相关阅读:
    聊天ListView
    Android笔试题三
    java内存分配与垃圾回收
    Activity切换的时候生命周期的变化
    二分查找
    如何用报表工具实现树状层级结构的填报表
    报表数据填报中的自动计算
    报表数据填报中的合法性校验
    tab 页形式展现多张报表
    报表工具之数据校验竟可以如此简单
  • 原文地址:https://www.cnblogs.com/pach/p/7337387.html
Copyright © 2020-2023  润新知