• POJ 2847 Widget Factory


    POJ_2947

        将M条信息翻译成同余方程组后用高斯消元求解就可以了。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #define MAXD 310
    using namespace std;
    int N, M, mat[MAXD][MAXD], ans[MAXD], h[MAXD];
    char a[5], b[5], day[][5] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
    int getday(char *b)
    {
        int i;
        for(i = 0; i < 7; i ++)
            if(strcmp(b, day[i]) == 0)
                break;
        return i;
    }
    void init()
    {
        int i, j, k, n;
        for(i = 0; i < M; i ++)
        {
            scanf("%d", &n);
            scanf("%s%s", a, b);
            mat[i][N] = (getday(b) - getday(a) + 8) % 7;
            memset(h, 0, sizeof(h));
            for(j = 0; j < n; j ++)
            {
                scanf("%d", &k);
                ++ h[k - 1];
            }
            for(j = 0; j < N; j ++)
                mat[i][j] = h[j] % 7;
        }
    }
    int gauss()
    {
        int i, j, k, x, y, a, b;
        for(i = j = 0; i < M && j < N; i ++, j ++)
        {
            if(mat[i][j] == 0)
            {
                for(k = i + 1; k < M; k ++)
                    if(mat[k][j])
                        break;
                if(k == M)
                {
                    -- i;
                    continue;
                }
                for(y = j; y <= N; y ++)
                    swap(mat[i][y], mat[k][y]);
            }
            for(x = i + 1; x < M; x ++)
                if(mat[x][j])
                {
                    a = mat[i][j], b = mat[x][j];
                    for(y = j; y <= N; y ++)
                        mat[x][y] = ((mat[x][y] * a - mat[i][y] * b) % 7 + 7) % 7;
                }
        }
        for(k = i; k < M; k ++)
            if(mat[k][N])
                return -1;
        if(i < N)
            return -2;
        for(i = N - 1; i >= 0; i --)
        {
            b = mat[i][N];
            for(j = i + 1; j < N; j ++)
                b -= mat[i][j] * ans[j];
            b = (b % 7 + 7) % 7;
            for(a = 3; a <= 9; a ++)
                if(((a * mat[i][i] % 7 + 7) % 7) == b)
                    break;
            ans[i] = a;
        }
        return 0;
    }
    void solve()
    {
        int i, k = gauss();
        if(k == -2)
            printf("Multiple solutions.\n");
        else if(k == -1)
            printf("Inconsistent data.\n");
        else
        {
            printf("%d", ans[0]);
            for(i = 1; i < N; i ++)
                printf(" %d", ans[i]);
            printf("\n");
        }
    }
    int main()
    {
        for(;;)
        {
            scanf("%d%d", &N, &M);
            if(!N && !M)
                break;
            init();
            solve();
        }
        return 0;
    }
  • 相关阅读:
    xcode
    2020上班第一天
    动态网页爬取方法
    静态网页爬虫获取数据的简单方法Xpath
    帆软9.0升级10.0(摘自帆软官方文档)
    linux下安装redis
    linux 命令笔记
    shell 编写mongodb linux下安装脚本
    pl/sql基础之三
    plsql基础二之集合
  • 原文地址:https://www.cnblogs.com/staginner/p/2496788.html
Copyright © 2020-2023  润新知