POJ 2947 Widget Factory(高斯消元)

举报
Linux猿 发表于 2021/08/04 23:37:13 2021/08/04
【摘要】 题目连接~~~    本题是对同余方程组消元,方程比较好列,本题可以列m个方程,每个方程可以列成k1*x1 + k2*x2……kn*xn = y1 (mod 7)  y1是加工这一批零件所需要的时间。然后解方程就可以了。 代码: #include <iostream>#include <cstdio>#include <c...

题目连接~~~
   本题是对同余方程组消元,方程比较好列,本题可以列m个方程,每个方程可以列成k1*x1 + k2*x2……kn*xn = y1 (mod 7)
 y1是加工这一批零件所需要的时间。然后解方程就可以了。

代码:


  
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <algorithm>
  8. using namespace std ;
  9. #define INF 0x3f3f3f3f
  10. const double esp = 0.00000001 ;
  11. const int MX = 300 + 10 ;
  12. const int MY = 100 + 10 ;
  13. int g[MX][MX] ,ans[MX] ;
  14. int Solve(char s[]){
  15. int f_num = 0 ;
  16. if(strcmp(s ,"MON") == 0) f_num = 1 ;
  17. else if(strcmp(s ,"TUE") == 0) f_num = 2 ;
  18. else if(strcmp(s ,"WED") == 0) f_num = 3 ;
  19. else if(strcmp(s ,"THU") == 0) f_num = 4 ;
  20. else if(strcmp(s ,"FRI") == 0) f_num = 5 ;
  21. else if(strcmp(s ,"SAT") == 0) f_num = 6 ;
  22. else if(strcmp(s ,"SUN") == 0) f_num = 7 ;
  23. return f_num ;
  24. }
  25. int Gcd(int a ,int b){
  26. int tmp ;
  27. while(b){
  28. tmp = a ;
  29. a = b ;
  30. b = tmp % b ;
  31. }
  32. return a ;
  33. }
  34. int Lcm(int a ,int b){
  35. return a/Gcd(a ,b)*b ;
  36. }
  37. int Gauss(int n ,int m ,int g[][MX] ,int mod){//n行 m列
  38. int max_r ;
  39. int k = 0 ,col = 0 ;
  40. for( ;k < n && col < m ; ++k ,++col){
  41. max_r = k ;
  42. for(int i = k+1 ;i < n ; ++i)
  43. if(abs(g[max_r][col]) < abs(g[i][col]))
  44. max_r = i ;
  45. if(!g[max_r][col]){
  46. k-- ; continue ;
  47. }
  48. if(max_r != k){
  49. for(int i = col ;i <= m ; ++i)
  50. swap(g[k][i] ,g[max_r][i]) ;
  51. }
  52. for(int i = k + 1 ;i < n ; ++i){
  53. if(g[i][col]){
  54. int LCM = Lcm(abs(g[k][col]) ,abs(g[i][col])) ;
  55. int ta = LCM/abs(g[i][col]) ;
  56. int tb = LCM/abs(g[k][col]) ;
  57. if(g[i][col] * g[k][col] < 0) tb = -tb ;
  58. for(int j = col ;j <= m ; ++j)
  59. g[i][j] = ((g[i][j]*ta - g[k][j]*tb)%mod +mod)%mod ;
  60. }
  61. }
  62. }
  63. for(int i = k ;i < n ; ++i)
  64. if(g[i][col]) return -1 ;
  65. if(k < m) return m-k ;
  66. for(int i = n-1 ;i >= 0 ; --i){
  67. int tmp = g[i][m] ;
  68. for(int j = i+1 ;j < m ; ++j){
  69. tmp -= g[i][j]*ans[j] ;
  70. tmp = (tmp%mod + mod)%mod ;
  71. }
  72. int sum ;
  73. for(int t = 3 ;t <= 9 ; ++t){
  74. sum = ((g[i][i]*t)%mod + mod)%mod ;
  75. if(sum == tmp){
  76. ans[i] = t ;
  77. break ;
  78. }
  79. }
  80. }
  81. return 0 ;
  82. }
  83. int main(){
  84. //freopen("input.txt" ,"r" ,stdin) ;
  85. char s1[MX] ,s2[MX] ;
  86. int n ,m ,mod = 7 ,num ,tmp ;
  87. while(~scanf("%d%d" ,&n ,&m)){
  88. if(!n && !m) break ;
  89. memset(g ,0 ,sizeof(g)) ;
  90. for(int i = 0 ;i < m ; ++i){
  91. scanf("%d%s%s" ,&num ,s1 ,s2) ;
  92. int d1 = Solve(s1) ;
  93. int d2 = Solve(s2) ;
  94. g[i][n] = ((d2 - d1 + mod)%mod + 1)%mod ;
  95. for(int j = 0 ;j < num ; ++j){
  96. scanf("%d" ,&tmp) ;
  97. g[i][tmp-1] = (g[i][tmp-1]+1)%mod ;
  98. }
  99. }
  100. memset(ans ,0 ,sizeof(ans)) ;
  101. int f_num = Gauss(m ,n ,g ,mod) ;
  102. if(!f_num) {
  103. for(int i = 0 ;i < n ; ++i)
  104. if(!i) printf("%d" ,ans[i]) ;
  105. else printf(" %d" ,ans[i]) ;
  106. puts("") ;
  107. }
  108. else if(f_num == -1) puts("Inconsistent data.") ;
  109. else puts("Multiple solutions.") ;
  110. }
  111. return 0 ;
  112. }



文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/52037223

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。