POJ 2947 Widget Factory (高斯消元 判多解 无解 和解集 模7情况)
2014-08-20 15:09
363 查看
题目链接
题意:
公司被吞并,老员工几乎全部被炒鱿鱼。一共有n种不同的工具,编号1-N(代码中是0—N-1),每种工具的加工时间为3—9天,但是现在老员工不在我们不知道每种工具的加工时间,庆幸的是还保留着一些对工人制造工具的记录,对于每个老员工,他的记录包括,他开始工作的时间(在某个星期的星期几),被炒鱿鱼的时间(某个星期的星期几),在第几个星期不知道.....在这段时间里,他正好加工了k件物品,给出了这k件物品的编号。我们要做的就是通过这些记录,来确定每种工具的加工时间是多少。
分析:
对于每个记录,建立一个方程,所有的记录,建立为如下的方程:
(a[0][0]*X0 + a[0][1] *X1 + a[0][2]*X2+...........a[0][n-1]*Xn-1 ) %7= a[0]
(a[1][0]*X0 + a[1][1] *X1 + a[1][2]*X2+...........a[1][n-1]*Xn-1 ) %7= a[1]
................................................................................................................................
(a[m-1][0]*X0 + a[m-1][1] *X1 + a[m-1][2]*X2+...........a[m-1][n-1]*Xn-1 ) %7= a[m-1]
一共有m个记录,即有m个方程,有n个变量(表示n个物品,编号0-N-1),方程中的x0, x1, x2........xn-1,代表的是第i种工具加工需要多长时间
a[ i ] [ j ] (0<=j<=n-1) ,表示第i个方程中(i从0开始),编号为j的物品,加工的个数,即Xj, a[i]
,表示第i个方程中,加工完所有种类的工具,需要的时间,因为不知道开始时间和结束时间是在第几个星期,只知道星期几,所以有 %7.
然后处理一下列方程就行了。a[i]
= 每个记录 的时间。
在做的过程中会遇到一些问题,可以参见注释,还有我的模板中加上那个判断有浮点数解的地方返回-2,会不对,貌似不应该加,这道题应该只有整数解。
题意:
公司被吞并,老员工几乎全部被炒鱿鱼。一共有n种不同的工具,编号1-N(代码中是0—N-1),每种工具的加工时间为3—9天,但是现在老员工不在我们不知道每种工具的加工时间,庆幸的是还保留着一些对工人制造工具的记录,对于每个老员工,他的记录包括,他开始工作的时间(在某个星期的星期几),被炒鱿鱼的时间(某个星期的星期几),在第几个星期不知道.....在这段时间里,他正好加工了k件物品,给出了这k件物品的编号。我们要做的就是通过这些记录,来确定每种工具的加工时间是多少。
分析:
对于每个记录,建立一个方程,所有的记录,建立为如下的方程:
(a[0][0]*X0 + a[0][1] *X1 + a[0][2]*X2+...........a[0][n-1]*Xn-1 ) %7= a[0]
(a[1][0]*X0 + a[1][1] *X1 + a[1][2]*X2+...........a[1][n-1]*Xn-1 ) %7= a[1]
................................................................................................................................
(a[m-1][0]*X0 + a[m-1][1] *X1 + a[m-1][2]*X2+...........a[m-1][n-1]*Xn-1 ) %7= a[m-1]
一共有m个记录,即有m个方程,有n个变量(表示n个物品,编号0-N-1),方程中的x0, x1, x2........xn-1,代表的是第i种工具加工需要多长时间
a[ i ] [ j ] (0<=j<=n-1) ,表示第i个方程中(i从0开始),编号为j的物品,加工的个数,即Xj, a[i]
,表示第i个方程中,加工完所有种类的工具,需要的时间,因为不知道开始时间和结束时间是在第几个星期,只知道星期几,所以有 %7.
然后处理一下列方程就行了。a[i]
= 每个记录 的时间。
在做的过程中会遇到一些问题,可以参见注释,还有我的模板中加上那个判断有浮点数解的地方返回-2,会不对,貌似不应该加,这道题应该只有整数解。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #define LL __int64 const int maxn = 300+10; const int INF = 1<<28; using namespace std; int equ, var, fn; int a[maxn][maxn], x[maxn]; bool free_x[maxn]; int gcd(int a, int b) { return b==0?a:gcd(b, a%b); } int lcm(int a, int b) { return a*b/gcd(a, b); } int Gauss() { int x_mo; x_mo = 7; int i, j, k, max_r, col; int ta, tb, LCM, tmp, fx_num; int free_index; col = 0; for(k = 0; k<equ && col<var; k++, col++) { max_r = k; for(i = k+1; i < equ; i++) if(abs(a[i][col])>abs(a[max_r][col])) max_r = i; if(max_r != k) for(j = k; j < var+1; j++) swap(a[k][j], a[max_r][j]); if(a[k][col]==0) { k--; continue; } for(i = k+1; i < equ; i++) { if(a[i][col] != 0) { LCM = lcm(abs(a[i][col]), abs(a[k][col])); ta = LCM/abs(a[i][col]); tb= LCM/abs(a[k][col]); if(a[i][col]*a[k][col] < 0) tb = -tb; for(j = col; j < var+1; j++) a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%x_mo+x_mo)%x_mo; } } } for(i = k; i < equ; i++) if(a[i][col] != 0) return -1; if(k < var) return var-k; for(i = var-1; i >= 0; i--) { tmp = a[i][var]; for(j = i+1; j < var; j++) if(a[i][j] != 0) tmp = ((tmp-a[i][j]*x[j])%x_mo+x_mo)%x_mo; if(a[i][i]==0) x[i] = 0; else { //if(tmp%a[i][i] != 0) return -2; while(tmp%a[i][i]!=0) tmp += x_mo; x[i] = (tmp/a[i][i])%x_mo; } } return 0; } int check(char s[]) { if(strcmp(s,"MON")==0) return 1; else if(strcmp(s,"TUE")==0) return 2; else if(strcmp(s,"WED")==0) return 3; else if(strcmp(s,"THU")==0) return 4; else if(strcmp(s,"FRI")==0) return 5; else if(strcmp(s,"SAT")==0) return 6; else return 7; } int main() { int n, m, i, k; char s1[20], s2[20]; while(~scanf("%d%d", &n, &m)) { equ = m; var = n; //m个方程,n个未知数 if(n==0&&m==0) break; memset(a, 0, sizeof(a)); memset(x, 0, sizeof(x)); memset(free_x, -1, sizeof(free_x)); for(i = 0; i < m; i++) { scanf("%d", &k); getchar(); scanf("%s %s", s1, s2); a[i] = ((check(s2)-check(s1)+1)%7+7)%7; //s1s2顺序不能乱,而且因为有负的所以需要这样处理 while(k--) { int tmp; scanf("%d", &tmp); tmp --; //因为a里面是从0开始的 a[i][tmp] ++; a[i][tmp] %= 7; //一定要对7取余,不然会wa,大概因为上面a[i] 取余了,如果这里不取余会使方程无解吧。 } } fn = Gauss(); if(fn<0) printf("Inconsistent data.\n"); if(fn>0) printf("Multiple solutions.\n"); else if(fn==0) { for(i = 0; i < n; i++) { if(x[i]<=2) x[i] += 7; //注意题目说3——9天 if(i==n-1) printf("%d\n", x[i]); else printf("%d ", x[i]); } } } return 0; }
相关文章推荐
- poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)
- POJ 2947-Widget Factory(高斯消元解同余方程式)
- poj 2947 Widget Factory(高斯消元解同余方程组)
- POJ 2947 Widget Factory 高斯消元
- POJ 2947 Widget Factory(高斯消元)
- Poj 2947 widget factory (高斯消元解同模方程)
- POJ 2947 Widget Factory (高斯消元)
- poj 2947 Widget Factory (高斯消元)
- poj 2947 Widget Factory(数学:高斯消元)
- poj 2947 Widget Factory(高斯消元)
- 文章标题 POJ 2947 : Widget Factory (高斯消元)
- poj -- 2947 Widget Factory(高斯消元)
- POJ 2947 2947 Widget Factory 高斯消元
- 【POJ 2947】Widget Factory(高斯消元+逆元)
- poj 2947 Widget Factory (高斯消元)
- POJ 2947 Widget Factory(高斯消元解同余方程组)
- poj 2947 Widget Factory(高斯消元)
- poj2947——Widget Factory(高斯消元求模线性方程)
- POJ 2947 Widget Factory 高斯消元 解线性同余方程
- POJ 2947 Widget Factory (高斯消元解同余方程组)