poj 2947 Widget Factory 夜

http://poj.org/problem?id=2947

基础高斯消元   注意时刻模7

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#define LL long long

using namespace std;

const int N=350;

int a[N][N];
int ans[N];
int n,m;
char s[9][5]={"","MON","TUE","WED","THU","FRI","SAT","SUN"};
int Date(char stemp[])
{
    for(int i=1;i<=7;++i)
    {
        if(strcmp(stemp,s[i])==0)
        return i;
    }
    return 0;
}
int findans(int x,int y)
{
    x=(x%7+7)%7;
    y=(y%7+7)%7;
    for(int i=3;i<=9;++i)
    {
        if(x*i%7==y)
        return i;
    }
}
void Gauss()
{
    int row=1;
    int col=1;
    while(row<=m&&col<=n)
    {
        int k=0;
        for(int i=row;i<=m;++i)
        if(a[i][col]!=0)
        {k=i;break;}
        if(k==0)//如果一列全为0 则列加一
        {++col;continue;}
        if(k!=row)//如果此行最前是0 则和不是0 的那一行交换
        for(int j=col;j<=n+1;++j)
        swap(a[row][j],a[k][j]);
        int x=a[row][col];
        for(int i=row+1;i<=m;i++)//把余下行的最前元素变成0 
        {
            int y=a[i][col];
            for(int j=col;j<=n+1;++j)
            {
                a[i][j]=(a[i][j]*x-y*a[row][j])%7;
            }
        }
        ++row;++col;
    }//这样最好形成的是右上三角
    for(int i=row;i<=m;++i)
    {
        if(a[i][n+1]!=0)//如果这样无解
        {
            printf("Inconsistent data.\n");
            return ;
        }
    }
    if(row!=col||row-1<n||col<=n)//row!=col 说明有一列全为0的状况 row-1<n说明A的秩小于n col<=n 说明列太长
    {
        printf("Multiple solutions.\n");
        return ;
    }
    for(int i=row-1;i>=1;--i)
    {
        int sum=0;
        for(int j=i+1;j<=n;++j)

        sum+=a[i][j]*ans[j];
        ans[i]=findans(a[i][i],a[i][n+1]-sum);
    }
    for(int i=1;i<=n;++i)
    {
        printf("%d",ans[i]);
        if(i==n)
        printf("\n");
        else
        printf(" ");
    }
}
int main()
{

    while(scanf("%d %d",&n,&m)!=EOF)
    {
        if(n==0&&m==0)
        break;
        memset(a,0,sizeof(a));
        int x;
        char d1[5],d2[5];
        for(int i=1;i<=m;++i)
        {
            scanf("%d %s %s",&x,d1,d2);
            //printf("%s %s\n",d1,d2);
            a[i][n+1]=Date(d2)-Date(d1)+1;
            while(x--)
            {
                int k;
                scanf("%d",&k);
                ++a[i][k];
            }
            for(int j=1;j<=n+1;++j)
            {
                a[i][j]%=7;
            }
        }
        Gauss();
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/liulangye/p/2608835.html