poj2947--Widget Factory(高斯消元)

题目链接:点击打开链接

题目大意:有n种零件,已知每种零件的加工时间最少为3天最多为9天,现在只知道有m个工程用的时间和加工的零件数,问可不可以求出每种零件的加工时间。

列出对7取余的m个方程,用高斯消元判断是否有解,并解出来。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#pragma comment(linker,"/STACK:102400000,102400000") ;
int Map[310][310] , a[310] ;
char str[8][10] = { "S","MON","TUE","WED","THU","FRI","SAT","SUN" } ;
char s1[10] , s2[10] ;
int n , m , ans[310] ;
int solve() {
    int i , j , k = 1 , l , temp , num = 0 , sum ;
    for(i = 1 ; i <= m && k <= n ; i++) {
        for(j = i ; j <= m ; j++)
            if( Map[j][k] ) break ;
        if( j > m ) {
            k++ ; i-- ;
            continue ;
        }
        if( j != i ) {
            for(l = k ; l <= n ; l++)
                swap(Map[i][l],Map[j][l]) ;
            swap(a[i],a[j]) ;
        }
        for(j = i+1 ; j <= m ; j++) {
            if( !Map[j][k] ) continue ;
            temp = Map[j][k] ;
            for(l = k ; l <= n ; l++) {
                Map[j][l] = Map[i][l]*temp - Map[j][l]*Map[i][k] ;
                Map[j][l] = (Map[j][l]%7 + 7) % 7 ;
            }
            a[j] = a[i]*temp - a[j]*Map[i][k] ;
            a[j] = (a[j]%7+7)%7 ;
        }
        num++ ;
        k++ ;
    }
    sum = 0 ;
    for(i = num+1 ; i <= m ; i++)
        if( a[i] ) return 0 ;
    if( num != n ) return 1 ;
    for(i = n ; i >= 1 ; i--) {
        for(j = i+1 ; j <= n ; j++){
            a[i] = a[i]-ans[j]*Map[i][j] ;
            a[i] = (a[i]%7+7)%7 ;
        }
        ans[i] = 0 ;
        for(j = 3 ; j <= 9 ; j++) {
            if( Map[i][i]*j%7 == a[i] )
                ans[i] = j ;
        }
        //if( !ans[i] ) return 0 ;
    }
    return 2 ;
}
int main() {
    int num , i , j , k1 , k2 , x ;
    while( scanf("%d %d", &n, &m) && n+m ) {
        memset(Map,0,sizeof(Map)) ;
        for(i = 1 ; i <= m ; i++) {
            scanf("%d %s %s", &num, s1, s2) ;
            for(j = 1 ; j <= 7 ; j++) {
                if( !strcmp(str[j],s1) ) k1 = j ;
                if( !strcmp(str[j],s2) ) k2 = j ;
            }
            a[i] = (k2-k1+1+7)%7 ;
            while( num-- ) {
                scanf("%d", &x) ;
                Map[i][x] = (Map[i][x]+1)%7 ;
            }
        }
        k1 = solve() ;
        if( k1 == 0 )
            printf("Inconsistent data.\n") ;
        else if( k1 == 1 )
            printf("Multiple solutions.\n") ;
        else {
            for(i = 1 ; i < n ; i++)
                printf("%d ", ans[i]) ;
            printf("%d\n", ans[n]) ;
        }
    }
    return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 14:34:46

poj2947--Widget Factory(高斯消元)的相关文章

[ACM] POJ 2947 Widget Factory (高斯消元)

Widget Factory Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 4436   Accepted: 1502 Description The widget factory produces several different kinds of widgets. Each widget is carefully built by a skilled widgeteer. The time required to

uva 1564 - Widget Factory(高斯消元+逆元)

题目链接:uva 1564 - Widget Factory 题目大意:n种零件,m次工作日程,零件序号从1到n,给出m次工作日程的信息,x,s,e,表示生产了x个零件,从星期s开始到星期e(有可能是多个星期),然后给出生产的x个零件的序号.求每个零件被生产需要多少天(保证在3到10天) 解题思路:因为不能确定每个工作日程具体生产了几天,所以对应列出的方程均为线性模方程(模7),所以在高斯消元的过程中遇到除法要转换成乘上逆元. #include <cstdio> #include <cs

poj 2947 Widget Factory(高斯消元)

description The widget factory produces several different kinds of widgets. Each widget is carefully built by a skilled widgeteer. The time required to build a widget depends on its type: the simple widgets need only 3 days, but the most complex ones

poj 2947 Widget Factory (高斯消元,解模线性方程)

链接:poj 2947 题意:生产一些零件,已知零件种数,记录条数 记录只记录了某次生产从周几开始,周几结束,以及生产了哪些产品. 每件商品生产所需天数为3-9天. 求每样产品需要多少天才能完成. 若无解输出Inconsistent data. 有无穷解输出Multiple solutions. 有唯一解,输出其解 分析:根据题目所给信息,可以列出同余方程组,再根据高斯消元求解, 但还得判断是无解,无穷解,还是唯一解 1.系数矩阵的秩若与增广矩阵的秩不相等,则无解,否则有解 2.若有解,若增广矩

Poj 2947 widget factory (高斯消元解同模方程)

题目连接: http://poj.org/problem?id=2947 题目大意: 有n种类型的零件,m个工人,每个零件的加工时间是[3,9],每个工人在一个特定的时间段内可以生产k个零件(可以相同种类,也可以不同种类),问每种零件生产一个出来需要的时间? 解题思路: 给出的时间段是从周几到周几,并没有给出具体的时间段,因此在计算过程中要进行取模,还有就是对每个零件要在题目要求的范围内进行枚举. ps:如果求出来的增广矩阵是n*n的,但是某个零件在[3,9]之间没有合理的解,也是无解的. 1

POJ2947Widget Factory(高斯消元解同模方程)

http://poj.org/problem?id=2947 题目大意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下:p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x,加7*x 是因为它可能生产很多周),第二行表示这p 件装饰物的种类(可能出现相同的种类,即ai=aj).规定每件装饰物至少生产3 天,最多生产9 天.问每种装饰物需要生产的天数.如果没有解,

POJ 2947-Widget Factory(高斯消元解同余方程式)

题目地址:id=2947">POJ 2947 题意:N种物品.M条记录,接写来M行,每行有K.Start,End,表述从星期Start到星期End,做了K件物品.接下来的K个数为物品的编号. 此题注意最后结果要调整到3-9之间. 思路: 非常easy想到高斯消元. 可是是带同余方程式的高斯消元,開始建立关系的时候就要MOD 7 解此类方程式时最后求解的过程要用到扩展gcd的思想,举个样例,假设最后得到的矩阵为: 1  1   4 0  6   4 则6 * X2 % 7= 4 % 7  则

UVA 1564 - Widget Factory(高斯消元)

UVA 1564 - Widget Factory 题目链接 题意:n种零件, 给定m个制作时间,每段时间制作k个零件,每种零件有一个制作时间,每段时间用Mon到Sun表示,求每个零件的制作时间,还要判断一下多解和无解的情况 思路:对于每段时间列出一个方程,这样一共列出m个方程解n个变元,利用高斯消元去求解,注意每个方程都是MOD 7的,所以在高斯消元过程中遇到除法要求该数字%7的逆元去进行运算 代码: #include <cstdio> #include <cstring> #i

POJ 2947 Widget Factory (高斯消元 判多解 无解 和解集 模7情况)

题目链接 题意: 公司被吞并,老员工几乎全部被炒鱿鱼.一共有n种不同的工具,编号1-N(代码中是0—N-1), 每种工具的加工时间为3—9天 ,但是现在老员工不在我们不知道每种工具的加工时间,庆幸的是还保留着一些对工人制造工具的记录,对于每个老员工,他的记录包括,他开始工作的时间(在某个星期的星期几),被炒鱿鱼的时间(某个星期的星期几),在第几个星期不知道.....在这段时间里,他正好加工了k件物品,给出了这k件物品的编号.我们要做的就是通过这些记录,来确定每种工具的加工时间是多少. 分析: 对

【POJ】2947 Widget Factory(高斯消元)

http://poj.org/problem?id=2947 各种逗啊..还好1a了.. 题意我就不说了,百度一大把. 转换为mod的方程组,即 (x[1,1]*a[1])+(x[1,2]*a[2])+...+(x[1,n]*a[n])=x[1, n+1] (mod m) (x[2,1]*a[1])+(x[2,2]*a[2])+...+(x[2,n]*a[n])=x[2, n+1] (mod m) ... (x[n,1]*a[1])+(x[n,2]*a[2])+...+(x[n,n]*a[n])