首页 > 其他 > 详细

POJ 2947 Widget Factory

时间:2017-02-18 09:47:04      阅读:179      评论:0      收藏:0      [点我收藏+]

题意:

有n种饰品,每种的加工时间为3~9天,现在知道m条记录,每条记录形如:开始时间是周几,终止时间是周几,加工出来哪些饰品,各多少件。但是不知道持续了多少周。
求每种饰品的加工时间。

需要判断无解和多解。


 

昨天晚上做到12:20....

显然是裸的同余方程组

无解?和异或方程组一样

多解?

异或方程组用的是高斯约当消元记录now很方便,同余方程高斯消元需要回代怎么办?于是我想到记录一个$pivot[i]$表示变元i用的是哪个方程,回代什么的用pivot[i]就行了

网上的题解太扯了还要什么复制到最后....

然后输入的时候别忘$mod 7$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=305;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<0||c>9){if(c==-)f=-1;c=getchar();}
    while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
    return x*f;
}
typedef int Matrix[N][N];
int n,m,P=7;
char s1[5],s2[5];
Matrix a;
int mp[300];
inline int num(char *s){
    if(s[0]==T) return s[1]==U?1:3;
    else if(s[0]==S) return s[1]==A?5:6;
    else return mp[s[0]];
}
int inv[10];
void iniInv(){
    inv[1]=1;
    for(int i=2;i<=P;i++) inv[i]=(-P/i*inv[P%i]%P+P)%P;
}
int now,pivot[N];
void Gauss(){
    now=1;
    for(int i=1;i<=n;i++){
        int j=now;
        while(j<=m&&!a[j][i]) j++;
        if(j==m+1) continue;
        //printf("hi %d %d %d\n",i,now,j);
        if(j!=now) for(int k=1;k<=n+1;k++) swap(a[now][k],a[j][k]);
        for(int j=now+1;j<=m;j++) if(a[j][i]){//printf("jjj %d\n",j);
            int t=a[j][i]*inv[a[now][i]]%P;//printf("t %d\n",t);
            for(int k=i;k<=n+1;k++) a[j][k]=(a[j][k]-a[now][k]*t%P+P)%P;
        }
        pivot[i]=now;//printf("pivot %d %d\n",i,pivot[i]);
        now++;
    }
    //printf("now %d\n",now);now--;
    for(int i=now;i>=1;i--){
        int pi=pivot[i],pj;
        for(int j=now;j>i;j--) 
            pj=pivot[j],a[pi][n+1]=(a[pi][n+1]-a[pi][pj]*a[pj][n+1]%P+P)%P;
            a[pi][n+1]=a[pi][n+1]*inv[a[pi][i]]%P;
    }
}
void solve(){
    //printf("now %d\n",now);
    //for(int i=1;i<=m;i++)
        //for(int j=1;j<=n+1;j++) printf("%d%c",a[i][j],j==n+1?‘\n‘:‘ ‘);
    for(int i=1;i<=m;i++) if(a[i][n+1]){
        int f=0; 
        for(int j=1;j<=n;j++) if(a[i][j]) {f=1;break;}
        if(f==0){puts("Inconsistent data.");return;}
    }
    if(now<n) {puts("Multiple solutions.");return;}
    for(int i=1;i<=n;i++) printf("%d%c",a[i][n+1]<3?a[i][n+1]+P:a[i][n+1],i==n?\n: );
}

inline void ini(){memset(a,0,sizeof(a));memset(pivot,0,sizeof(pivot));}
int main(){
    //freopen("in","r",stdin);
    mp[M]=0;mp[W]=2;mp[F]=4;
    iniInv();
    while(true){
        ini();
        n=read();m=read();
        if(n==0&&m==0) break;
        for(int i=1;i<=m;i++){
            int k=read();scanf("%s%s",s1,s2);
            a[i][n+1]=(num(s2)-num(s1)+1+P)%P;
            while(k--) a[i][read()]++;
            for(int j=1;j<=n+1;j++) a[i][j]%=P;
            //printf("a %d\n",i);
            //for(int j=1;j<=n+1;j++) printf("%d%c",a[i][j],j==n+1?‘\n‘:‘ ‘);
        }
        Gauss();
        solve();
    }
}

 

POJ 2947 Widget Factory

原文:http://www.cnblogs.com/candy99/p/6412243.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!