poj2947 Widget Factory 【高斯消元】

来源:互联网 发布:知乎 品牌和市场区别 编辑:程序博客网 时间:2024/05/16 08:19

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

题意:有n个部件,m个记录,记录描述了,某些部件在那个时间段(只说明了星期a到星期b,没有明确多少时间),每个部件完成的时间3~9天。现在要你找出每个部件完成的时间。

思路:每个记录的时间可以表示为 ((b-a+1)%7+7)%7.  很显然,每个记录都可以看成一个方程,所以就有m个方程,n个未知数,用高斯消元求解。

代码:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<vector>#include<queue>#include<cmath>#include<stack>#include<set>#include<map>#define INF 0x3f3f3f3f#define Mn 1010#define Mm 2000005#define mod 1000000007#define CLR(a,b) memset((a),(b),sizeof((a)))#define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1))#define CPY(a,b) memcpy ((a), (b), sizeof((a)))#pragma comment(linker, "/STACK:102400000,102400000")#define ul u<<1#define ur (u<<1)|1using namespace std;typedef long long ll;int a[Mn][Mn];int x[Mn];int free_x[Mn];int gcd(int a,int b) {    return b==0?a:gcd(b,a%b);}int lcm(int a,int b) {    return a/gcd(a,b)*b;}int gauss(int equ,int var) {    int k,col,max_r,cnt=0;    for(col=0,k=0;k<equ&&col<var;k++,col++) {        max_r=k;        for(int i=k+1;i<equ;i++)            if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;        if(max_r!=k)            for(int j=col;j<=var;j++) swap(a[k][j],a[max_r][j]);        if(a[k][col]==0) {            k--;            free_x[cnt++]=col;            continue;        }        for(int i=k+1;i<equ;i++) {            if(a[i][col]) {               int LCM=lcm(abs(a[i][col]),abs(a[k][col]));               int ta=LCM/abs(a[i][col]);               int tb=LCM/abs(a[k][col]);               if(a[i][col]*a[k][col]<0) tb=-tb;               for(int j=col;j<=var;j++) {                    a[i][j]=((a[i][j]*ta-a[k][j]*tb)%7+7)%7;               }            }        }    }    for(int i=k;i<equ;i++) {        if(a[i][col]) return -1;    }    if(k<var) return var-k;    for(int i=var-1;i>=0;i--) {        int tmp=a[i][var];        for(int j=i+1;j<var;j++) {            if(a[i][j]) tmp=((tmp-a[i][j]*x[j])%7+7)%7;        }        while(tmp%a[i][i]) tmp+=7;        x[i]=(tmp/a[i][i])%7;    }    return 0;}int getday(char *s) {    int re;    if(!strcmp(s,"MON")) re=1;    else if(!strcmp(s,"TUE")) re=2;    else if(!strcmp(s,"WED")) re=3;    else if(!strcmp(s,"THU")) re=4;    else if(!strcmp(s,"FRI")) re=5;    else if(!strcmp(s,"SAT")) re=6;    else re=7;    return re;}int main() {    int n,m;    char s[10],p[10];    while(~scanf("%d%d",&n,&m)) {        if(n==0&&m==0) break;        CLR(a,0);        for(int i=0;i<m;i++) {            int k;            scanf("%d %s %s",&k,s,p);            a[i][n]=((getday(p)-getday(s)+1)%7+7)%7;            for(int j=0;j<k;j++) {                int y;                scanf("%d",&y);                a[i][y-1]=(a[i][y-1]+1)%7;            }        }        int ans=gauss(m,n);        if(ans==-1) printf("Inconsistent data.\n");        else if(ans) printf("Multiple solutions.\n");        else {            for(int i=0;i<n-1;i++) {                if(x[i]<3) x[i]+=7;                printf("%d ",x[i]);            }            if(x[n-1]<3) x[n-1]+=7;            printf("%d\n",x[n-1]);        }    }    return 0;}



0 0
原创粉丝点击