poj 2947 Widget Factory(数学:高斯消元)
来源:互联网 发布:nodejs 官网cms 编辑:程序博客网 时间:2024/06/05 03:43
又是模板题。。。
直接套后来的加强版模板就可以了
建立m行n列的矩阵,并解对应方程
代码如下:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 400using namespace std;int x[MAXN];int free_x[MAXN];int a[MAXN][MAXN];char sta[10], end[10];char str[][5] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};void print(int m, int n) { for(int i=0; i<m; ++i) { for(int j=0; j<=n; ++j) printf("%d ", a[i][j]); puts(""); }}int gcd(int a, int b) { return b ? gcd(b, a%b) : a;}int lcm(int a, int b) { return a/gcd(a, b)*b;}int gauss(int m, int n) { int ta, tb, LCM, col; int free_x_num, free_index; int i, j, k, max_r, tmp; for(int i=0; i<=n; ++i) { x[i] = 0; free_x[i] = true; } col = 0; for(k=0; k<m&&col<n; ++k, ++col) { max_r = k; for(i=k+1; i<m; ++i) { if(abs(a[i][col]) > abs(a[max_r][col])) max_r = i; } if(max_r != k) for(j=k; j<=n; ++j) swap(a[k][j], a[max_r][j]); if(a[k][col] == 0) { --k; continue; } for(i=k+1; i<m; ++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<=n; ++j) a[i][j] = ((a[i][j]*ta-a[k][j]*tb)%7+7)%7; } } } for(i=k; i<m; ++i) if(a[i][col]) return -1; if(k < n) { for(i=k-1; i>=0; --i) { free_x_num = 0; for(j=0; j<n; ++j) { if(a[i][j]!=0 && free_x[j]) free_x_num++, free_index = j; } if(free_x_num > 1) continue; tmp = a[i][n]; for(j=0; j<n; ++j) { if(a[i][j] && j!=free_index) tmp -= a[i][j]*x[j]%7; tmp = (tmp%7+7)%7; } x[free_index] = (tmp/a[i][free_index])%7; free_x[free_index] = 0; } return n-k; } for(i=n-1; i>=0; --i) { tmp = a[i][n]; for(j=i+1; j<n; ++j) { if(a[i][j]) { tmp -= a[i][j]*x[j]; } tmp = (tmp%7+7)%7; } while(tmp%a[i][i] != 0) tmp+=7; x[i] = tmp/a[i][i]%7; } return 0;}int get_day(char s1[], char s2[]) { int x, y; for(int i=0; i<7; ++i) { if(strcmp(s1, str[i]) == 0) { x = i; break; } } for(int i=0; i<7; ++i) { if(strcmp(s2, str[i]) == 0) { y = i; break; } } int tmp = y+1-x; return tmp;}int main(void) { int m, n, k, nx; while(scanf("%d%d", &n, &m) && (n||m)) { memset(a, 0, sizeof(a)); for(int i=0; i<m; ++i) { scanf("%d", &k); scanf("%s%s", sta, end); a[i][n] = (get_day(sta, end)%7+7)%7; while(k--) { scanf("%d", &nx); --nx; ++a[i][nx]; a[i][nx] %= 7; } } //print(m, n); int ans = gauss(m, n); //print(m, n); if(ans == -1) puts("Inconsistent data."); else if(ans == 0){ for(int i=0; i<n; ++i) if(x[i] < 3) x[i] += 7; for(int i=0; i<n-1; ++i) printf("%d ", x[i]); printf("%d\n", x[n-1]); } else puts("Multiple solutions."); } return 0;}
0 0
- poj 2947 Widget Factory(数学:高斯消元)
- poj 2947 Widget Factory(高斯消元)
- [ACM] 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 (高斯消元)
- Widget Factory - POJ 2947 高斯消元
- poj 2947 Widget Factory (高斯消元)
- POJ 2947 Widget Factory(高斯消元)
- POJ 2947 Widget Factory(高斯消元)
- poj 2947 Widget Factory
- POJ 2947 Widget Factory
- POJ 2947 Widget Factory
- HDU 2124 Repair the Wall
- 【Cocos2d-x 3.0】游戏开发之android交叉编译
- HDOJ 1008
- 为什么设置的背景图像不显示?
- UIDatePicker时间选择器
- poj 2947 Widget Factory(数学:高斯消元)
- Android UI个性style
- AStyle代码格式工具在source insight中的使用
- android 连接数据库
- 判断当前的网络状态
- 你需要知道的其它重要的框架
- C盘O字节
- 1007:A+B 输入输出练习VIII【JAVA实现】
- 福德宫的发生过大风歌