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

题目连接:

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

题目大意:

  有n种类型的零件,m个工人,每个零件的加工时间是[3,9],每个工人在一个特定的时间段内可以生产k个零件(可以相同种类,也可以不同种类),问每种零件生产一个出来需要的时间?

解题思路:

  给出的时间段是从周几到周几,并没有给出具体的时间段,因此在计算过程中要进行取模,还有就是对每个零件要在题目要求的范围内进行枚举。

ps:如果求出来的增广矩阵是n*n的,但是某个零件在[3,9]之间没有合理的解,也是无解的。

  1 #include <cmath>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <iostream>
  5 #include <algorithm>
  6 using namespace std;
  7 const int maxn = 310;
  8 int det[maxn][maxn], res[maxn], var, equ;
  9 char str[10][10] = {"","MON", "TUE", "WED", "THU", "FRI", "SAT" , "SUN"};
 10 int Day (char s[])
 11 {
 12     for (int i=1; i<8; i++)
 13         if (strcmp(s, str[i]) == 0)
 14             return i;
 15 }
 16 int gauss ()
 17 {
 18     int col, k;
 19     for (k=col=0; k<equ&&col<var; k++, col++)
 20     {
 21         int Max_i = k;
 22         for (int i=k+1; i<equ; i++)
 23             if (abs(det[i][col]) > abs(det[Max_i][col]))
 24                 Max_i = i;
 25         if (Max_i != k)
 26             for (int i=col; i<=var; i++)
 27                 swap (det[k][i], det[Max_i][i]);
 28         if (det[k][col] == 0)
 29         {
 30             k --;
 31             continue;
 32         }
 33         for (int i=k+1; i<equ; i++)
 34             if (det[i][col])
 35             {
 36                 int x = det[i][col];
 37                 int y = det[k][col];
 38                 for (int j=col; j<=var; j++)
 39                     det[i][j] = ((det[i][j]*y - det[k][j]*x) % 7 + 7) % 7;
 40             }
 41     }
 42     int temp = 0, i, j;
 43     for (i=0; i<equ; i++)
 44     {
 45         for (j=0; j<var; j++)
 46             if (det[i][j])
 47                 break;
 48         if (j == var)
 49         {
 50             if (det[i][j])
 51                 return 0;//增广矩阵无解
 52             else if (i < var)//增广矩阵存在不确定变元
 53                 temp ++;
 54         }
 55     }
 56     if (temp || var > equ)
 57         return 1;//增广矩阵存在不确定变元
 58
 59     for (i=var-1; i>=0; i--)
 60     {
 61         temp = 0;
 62         for (j=i+1; j<var; j++)
 63             temp = (temp + det[i][j] * res[j]) % 7;
 64         for (j=3; j<10; j++)//枚举每个零件的加工时长
 65             if ((temp + det[i][i]*j)%7 == det[i][var])
 66             {
 67                 res[i] = j;
 68                 break;
 69             }
 70         if (j == 10)//当有某个零件的加工时长不在[3,9]之间,则不符合题意,无解
 71             return 0;
 72     }
 73     return 2;
 74 }
 75 int main ()
 76 {
 77     while (scanf ("%d %d", &var, &equ), var+equ)
 78     {
 79         int k, x;
 80         char st[maxn], et[maxn];
 81         memset (det, 0, sizeof(det));
 82         for (int i=0; i<equ; i++)
 83         {
 84             scanf ("%d %s %s", &k, st, et);
 85             while (k --)
 86             {
 87                 scanf ("%d", &x);
 88                 det[i][x-1] ++;
 89             }
 90             det[i][var] = Day(et) - Day(st) + 1;
 91         }
 92         for (int i=0; i<equ; i++)//这里一定要去次余,如果det[i][j]是7的倍数,在划成阶梯阵的过程中很有可能会错
 93             for (int j=0; j<=var; j++)
 94                 det[i][j] = (det[i][j] % 7 + 7) % 7;
 95         int ans = gauss();
 96         if (ans == 0)
 97             printf ("Inconsistent data.\n");
 98         else if (ans == 1)
 99             printf ("Multiple solutions.\n");
100         else
101             for (int i=0; i<var; i++)
102                 printf ("%d%c", res[i], i==var-1?‘\n‘:‘ ‘);
103     }
104     return 0;
105 }
时间: 2024-10-13 20:56:33

Poj 2947 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

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

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

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

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 天.问每种装饰物需要生产的天数.如果没有解,

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(高斯消元解同余方程式)

题目地址: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  则

POJ 2065 SETI(高斯消元解模方程组)

题目: SETI Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1693   Accepted: 1054 Description For some years, quite a lot of work has been put into listening to electromagnetic radio signals received from space, in order to understand what

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

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

poj2947(高斯消元解同模方程组)

题目链接: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