题目:http://poj.org/problem?id=2947 题意:工人生产不同的部件需要不同的时间,最少需要3天,最多需要9天。 现有给出n种部件和m条记录,每条记录包括该工人生产部件的总数k和他开始生产时间和结束时间(只给出是周几,不给出具体时间),之后给出这K个部件跟别所属的种类。 最后求出生产这n种部件分别所需要的时间。 思路:高斯消元,设每种部件生产一个所需要的天数为xi, 每种部件的个数为ai(1<=i<=n), 所需天数为yj(1<=j<=m), 方程组为 a1*x1+a2*x2+…………an*xn=yj mod 7. 需要注意的是,得出的结果必须在3--9之间~~~#include <stdio.h> #include <string.h> #include <iostream> #include <stdlib.h> using namespace std; const int maxn=300; int map[maxn+10][maxn+10]; char ch[7][5]={"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; int n, m, k, t, s, e; char start[5], end[5]; int gcd(int a, int b) { int tem; while (b) { tem=a%b, a=b, b=tem; } return a; } int lcm(int a, int b) { return a*b/gcd(a, b); } int Gauss() { int row, col, LCM, ta, tb; for (row=0, col=0; row<m, col<n; row++, col++) { int maxr=row; for (int i=row+1; i<m; i++) if (map[i][col]>map[row][col]) maxr=i; if (maxr!=row) for (int i=0; i<=n; i++) swap(map[maxr][i], map[row][i]); if (map[row][col]==0) {row--; continue;} for (int i=row+1; i<m; i++) { if (!map[i][col]) continue; LCM=lcm(map[row][col], map[i][col]); ta=LCM/map[row][col], tb=LCM/map[i][col]; for (int j=col; j<=n; j++) map[i][j]=((map[row][j]*ta-map[i][j]*tb)%7+7)%7; } } for (int i=row; i<m; i++) if (map[i][n]) return -1; if (row<n) return 0; for (int i=n-1; i>=0; i--) { for (int j=i+1; j<n; j++) if (map[i][j]) map[i][n]=((map[i][n]-map[i][j]*map[j][n])%7+7)%7; while (map[i][n]%map[i][i]) map[i][n]+=7; map[i][n]=(map[i][n]/map[i][i])%7; } return 1; } int main() { //freopen("in.txt", "r", stdin); while (scanf("%d %d", &n, &m)==2) { if (n==0&&m==0) break; memset(map, 0, sizeof(map)); for (int i=0; i<m; i++) { scanf("%d %s %s", &k, start, end); for (int j=0; j<7; j++) { if (strcmp(start, ch[j])==0) s=j; if (strcmp(end, ch[j])==0) e=j; } map[i][n]=(e-s+1+7)%7; for (int j=0; j<k; j++) { scanf("%d", &t); map[i][t-1]++; } for (int j=0; j<n; j++) map[i][j]=map[i][j]%7; } int flag=Gauss(); if (flag==-1) printf("Inconsistent data.\n"); else if (flag==0) printf("Multiple solutions.\n"); else { for (int i=0; i<n-1; i++) { if (map[i][n]<3) printf("%d ", map[i][n]+7); else printf("%d ", map[i][n]); } if (map[n-1][n]<3) printf("%d\n", map[n-1][n]+7); else printf("%d\n", map[n-1][n]); } } return 0; }
PKU 2947 Widget Factory
最新推荐文章于 2018-10-12 20:04:00 发布
本文提供了一道来自POJ平台的问题2947的解答方案,利用高斯消元法解决了一个关于工人生产不同部件所需时间的问题。通过建立数学模型并编程实现,最终求解出每种部件的生产周期。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
Stable-Diffusion-3.5
图片生成
Stable-Diffusion
Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

103

被折叠的 条评论
为什么被折叠?



