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;

}

你可能感兴趣的:(factory)