poj2947 Widget Factory 【高斯消元】
来源:互联网 发布:知乎 品牌和市场区别 编辑:程序博客网 时间:2024/05/16 08:19
链接:http://poj.org/problem?id=2947
题意:有n个部件,m个记录,记录描述了,某些部件在那个时间段(只说明了星期a到星期b,没有明确多少时间),每个部件完成的时间3~9天。现在要你找出每个部件完成的时间。
思路:每个记录的时间可以表示为 ((b-a+1)%7+7)%7. 很显然,每个记录都可以看成一个方程,所以就有m个方程,n个未知数,用高斯消元求解。
代码:
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<vector>#include<queue>#include<cmath>#include<stack>#include<set>#include<map>#define INF 0x3f3f3f3f#define Mn 1010#define Mm 2000005#define mod 1000000007#define CLR(a,b) memset((a),(b),sizeof((a)))#define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1))#define CPY(a,b) memcpy ((a), (b), sizeof((a)))#pragma comment(linker, "/STACK:102400000,102400000")#define ul u<<1#define ur (u<<1)|1using namespace std;typedef long long ll;int a[Mn][Mn];int x[Mn];int free_x[Mn];int gcd(int a,int b) { return b==0?a:gcd(b,a%b);}int lcm(int a,int b) { return a/gcd(a,b)*b;}int gauss(int equ,int var) { int k,col,max_r,cnt=0; for(col=0,k=0;k<equ&&col<var;k++,col++) { max_r=k; for(int i=k+1;i<equ;i++) if(abs(a[i][col])>abs(a[max_r][col])) max_r=i; if(max_r!=k) for(int j=col;j<=var;j++) swap(a[k][j],a[max_r][j]); if(a[k][col]==0) { k--; free_x[cnt++]=col; continue; } for(int i=k+1;i<equ;i++) { if(a[i][col]) { int LCM=lcm(abs(a[i][col]),abs(a[k][col])); int ta=LCM/abs(a[i][col]); int tb=LCM/abs(a[k][col]); if(a[i][col]*a[k][col]<0) tb=-tb; for(int j=col;j<=var;j++) { a[i][j]=((a[i][j]*ta-a[k][j]*tb)%7+7)%7; } } } } for(int i=k;i<equ;i++) { if(a[i][col]) return -1; } if(k<var) return var-k; for(int i=var-1;i>=0;i--) { int tmp=a[i][var]; for(int j=i+1;j<var;j++) { if(a[i][j]) tmp=((tmp-a[i][j]*x[j])%7+7)%7; } while(tmp%a[i][i]) tmp+=7; x[i]=(tmp/a[i][i])%7; } return 0;}int getday(char *s) { int re; if(!strcmp(s,"MON")) re=1; else if(!strcmp(s,"TUE")) re=2; else if(!strcmp(s,"WED")) re=3; else if(!strcmp(s,"THU")) re=4; else if(!strcmp(s,"FRI")) re=5; else if(!strcmp(s,"SAT")) re=6; else re=7; return re;}int main() { int n,m; char s[10],p[10]; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; CLR(a,0); for(int i=0;i<m;i++) { int k; scanf("%d %s %s",&k,s,p); a[i][n]=((getday(p)-getday(s)+1)%7+7)%7; for(int j=0;j<k;j++) { int y; scanf("%d",&y); a[i][y-1]=(a[i][y-1]+1)%7; } } int ans=gauss(m,n); if(ans==-1) printf("Inconsistent data.\n"); else if(ans) printf("Multiple solutions.\n"); else { for(int i=0;i<n-1;i++) { if(x[i]<3) x[i]+=7; printf("%d ",x[i]); } if(x[n-1]<3) x[n-1]+=7; printf("%d\n",x[n-1]); } } return 0;}
0 0
- [POJ2947] Widget Factory && 高斯消元
- poj2947 Widget Factory 【高斯消元】
- poj2947--Widget Factory(高斯消元)
- 模板 poj2947 Widget Factory 高斯消元
- [POJ2947]Widget Factory(高斯消元)
- POJ2947 Widget Factory【高斯消元】【同余方程】
- POJ2947 Widget Factory(高斯消元模板题)
- POJ2947——Widget Factory
- POJ2947 Widget Factory 高斯消元+扩展GCD解同余方程组
- POJ2947:Widget Factory(高斯消元,解模线性方程)
- 【POJ2947】 Widget Factory (模线性方程)
- poj2947——Widget Factory(高斯消元求模线性方程)
- poj2947 Widget Factory (高斯消元解模线性方程组)
- poj2947 Widget Factory(gauss--->≡)
- Widget Factory--高斯消元
- poj2947 高斯消元
- POJ 2947 Widget Factory 高斯消元
- poj -- 2947 Widget Factory(高斯消元)
- HibernateDaoSupport的getHibernateTemplate()的find方法大全
- LeetCode进阶之路(Next Permutation)
- 数据结构--排序算法(一)冒泡排序
- hdoj-4549-M斐波那契数列
- JVM深入理解
- poj2947 Widget Factory 【高斯消元】
- 跟我学Redis(7)—set类型及操作
- 自定义主题中的属性
- 算法之最简单的堆笔记
- Android遇到的坑小结
- 程序员的第二天
- hdoj-1023-Train Problem II
- PHP5.4.36 RHEL6.5 源码编译安装
- UVALive 6611 Alice's Print Service(二分)