POJ 2947 Widget Factory
来源:互联网 发布:淘宝是下订单扣钱 编辑:程序博客网 时间:2024/05/16 02:38
高斯消元第一题。
借用宝哥的模版就这样华丽丽的过了,因为不知道在哪里取模还Wa了几次~
题目大意:
给出零件的种类数量n与记录的条数m,紧接着有m条记录,记录了在星期几到星期几之间(有可能间隔多个星期)成产了多少个什么样的零件。求每个零件生产需要多少天。
解题思路:
实际上题目就是给了一个多元一次方程组。只不过系数和常数都是模7的。
高斯消元解方程就行!~
下面是代码:
#include <set>#include <map>#include <queue>#include <math.h>#include <vector>#include <string>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>#define eps 1e-9#define pi acos(-1.0)#define inf 107374182#define inf64 1152921504606846976#define lc l,m,tr<<1#define rc m + 1,r,tr<<1|1#define iabs(x) ((x) > 0 ? (x) : -(x))#define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE))#define clearall(A, X) memset(A, X, sizeof(A))#define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE))#define memcopyall(A, X) memcpy(A , X ,sizeof(X))#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )#define min( x, y ) ( ((x) < (y)) ? (x) : (y) )using namespace std;int change(char s[10]){ 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;}char s1[10],s2[10];int matrix[305][305],n,m,X[305];bool free_x[305];int LCM(int a,int b){ return a*b/__gcd(a,b);}void Debug(void){ puts(""); int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n + 1; j++) { cout << matrix[i][j] << " "; } cout << endl; } cout << endl;}int Guass(){ int i,j,k,col; clearall(X,0); clearall(free_x,1);//把解集清空,所有变量都标为自由变量 //Debug(); for (k = 0,col = 0; k < m && col < n; ++k, ++col) //枚举行列 { int max_r = k;//找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差) for (i = k + 1; i < m; ++i) { if (iabs(matrix[i][col]) > iabs(matrix[max_r][col])) max_r = i; } if (max_r != k) //交换 { for (i = k; i < n + 1; ++i) swap(matrix[k][i],matrix[max_r][i]); } if (matrix[k][col] == 0) //如果对应该列都为0,枚举该行的下一列 { k--; continue; } for (i = k + 1; i < m; ++i) //将k后边的col进行初等变换成行阶梯矩阵 { if (matrix[i][col] != 0) { int lcm = LCM(matrix[k][col],matrix[i][col]); int ta = lcm/iabs(matrix[i][col]); int tb = lcm/iabs(matrix[k][col]); if (matrix[i][col]*matrix[k][col] < 0) tb = -tb; for (j = col; j < n + 1; ++j) { matrix[i][j] =( (ta*matrix[i][j] - tb*matrix[k][j])%7+7)%7; } } } } //Debug(); // 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0). 即R(A) != R(A')无解 for (i = k; i < m; ++i) { if (matrix[i][col] != 0) return -1; } // 2. 无穷解的情况: 在n * (n + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵. // 且出现的行数即为自由变元的个数. 即R(A) = R(A') < n //printf("%d %d\n",k,n); if (k < n) { //注释处为求多解的自由变量 /*// 首先,自由变元有n - k个,即不确定的变元至少有n - k个. int num = 0,freeidx; for (i = k - 1; i >= 0; --i) { num = 0;// 用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元. int tmp = matrix[i][n]; // 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第m行. // 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的. for (j = 0; j < n; ++j) { if (matrix[i][j] != 0 && free_x[j]) { num++; freeidx = j; } } if (num > 1) continue; // 无法求解出确定的变元. // 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的. tmp = matrix[i][n]; for (j = 0; j < n; ++j) { if (matrix[i][j] && j != freeidx) tmp -= matrix[i][j]*X[j]; } X[freeidx] = tmp/matrix[i][freeidx]; free_x[freeidx] = 0; }*/ return n - k; } // 3. 唯一解的情况: 在n * (n + 1)的增广阵中形成严格的上三角阵. // 计算出Xn-1, Xn-2 ... X0. for (i = k - 1; i >= 0; --i) { int tmp = matrix[i][n]; for (j = i + 1; j < n; ++j) { tmp =((tmp- matrix[i][j]*X[j])%7+7)%7; } while(tmp%matrix[i][i]!=0) tmp+=7; X[i] = (tmp/matrix[i][i])%7; if(X[i]<3)X[i]+=7; } return 0;}int main(){ int k,x; while(scanf("%d%d",&n,&m),n||m) { clearall(matrix,0); for(int i=0; i<m; i++ ) { scanf("%d%s%s",&k,s1,s2); matrix[i][n]=change(s2)-change(s1)+1; matrix[i][n]=(matrix[i][n]%7+7)%7; for(int j=0; j<k; j++) { scanf("%d",&x); matrix[i][x-1]++; } for(int j=0; j<n; j++) { matrix[i][j]%=7; } } int sta=Guass(); if(sta==-1) { puts("Inconsistent data."); } else if(sta!=0)puts("Multiple solutions."); else { for(int i=0;i<n;i++) { if(i!=0)printf(" "); printf("%d",X[i]); } puts(""); } } return 0;}
0 0
- 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 (高斯消元)
- Widget Factory - POJ 2947 高斯消元
- poj 2947 Widget Factory (高斯消元)
- POJ 2947 Widget Factory(高斯消元)
- 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 求同余方程
- 《Linux设备驱动开发详解》——第16章 Linux网络设备驱动二
- zigbee zstack的关系
- 【快速幂取模】HDU 1061---Rightmost Digit
- 学习 easyui 之四:禁用 linkbutton 问题
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- POJ 2947 Widget Factory
- hdu1233还是畅通工程(并查集加Kruskal算法)
- 数据库如何降级?
- 取数组/序列之和k最小
- ios数组基本用法和排序
- jQuery 笔记
- JVM原理和优化详解
- 笔记67--ViewPager+ScrollView+ListView/GridView
- 工厂方法