zoukankan      html  css  js  c++  java
  • poj 2947 Widget Factory

    高斯消元法解方程组!!

    不过这题要取模

    高斯消元法详解请看这:http://blog.163.com/baobao_zhang@126/blog/static/4825236720099202538409/

      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<algorithm>
      4 #include<iomanip>
      5 #include<cmath>
      6 #include<cstring>
      7 #include<vector>
      8 #include<map>
      9 #define ll __int64
     10 #define pi acos(-1.0)
     11 #define MAX 500
     12 using namespace std;
     13 int equ,var;
     14 int an[MAX][MAX];
     15 int x[MAX];
     16 bool free_x[MAX];
     17 int free_num;
     18 map<string,int>p;
     19 void init()
     20 {
     21     p["MON"] = 0;
     22     p["TUE"] = 1;
     23     p["WED"] = 2;
     24     p["THU"] = 3;
     25     p["FRI"] = 4;
     26     p["SAT"] = 5;
     27     p["SUN"] = 6;
     28 }
     29 int gcd(int a,int b)
     30 {
     31     int t;
     32     if(a<b) swap(a,b);
     33     while(b){
     34         t=a;
     35         a=b;
     36         b=t%b;
     37     }
     38     return a;
     39 }
     40 int lcm(int a,int b)
     41 {
     42     return a/gcd(a,b)*b;
     43 }
     44 //高斯消元法解方程组。
     45 //-2表示有浮点数解,但无整数解;-1表示无解;0表示唯一解
     46 //大于0表示无穷解。并返回自由变元个数
     47 int Gauss()
     48 {
     49     int i,j,k,max_r,col,ta,tb;
     50     int LCM,temp,free_x_num,free_index;
     51     for(k=0,col=0;k<equ&&col<var;k++,col++){//k表示行,col表示列
     52         max_r=k;//标记绝对值最大的那个数,在该列中
     53         for(i=k+1;i<equ;i++)
     54             if(abs(an[i][col])>abs(an[max_r][col]))
     55                 max_r=i;
     56         if(max_r!=k)
     57             for(j=k;j<var+1;j++)
     58                 swap(an[k][j],an[max_r][j]);
     59         if(an[k][col]==0){//如果为0则k以下的行全是0了
     60             k--;//行保持不变,列增加1
     61             continue;
     62         }
     63         for(i=k+1;i<equ;i++){
     64             if(an[i][col]!=0){
     65                 LCM=lcm(abs(an[i][col]),abs(an[k][col]));
     66                 ta=LCM/abs(an[i][col]);
     67                 tb=LCM/abs(an[k][col]);
     68                 if(an[i][col]*an[k][col]<0) tb=-tb;
     69                 for(j=col;j<var+1;j++)
     70                     an[i][j]=((an[i][j]*ta-an[k][j]*tb)%7+7)%7;
     71             }
     72         }
     73           }
     74     //无解
     75     for(i=k;i<equ;i++)
     76         if(an[i][col]!=0) return -1;
     77     if(k<var){
     78         return var-k;
     79     }
     80     //唯一解
     81     for(i=var-1;i>=0;i--){
     82         temp=an[i][var];
     83         for(j=i+1;j<var;j++)
     84             if(an[i][j]!=0)
     85                 temp=((temp-an[i][j]*x[j])%7+7)%7;
     86        // if(temp%an[i][j]!=0) return -2;
     87         while(temp%an[i][i]!=0) temp+=7;
     88         x[i]=(temp/an[i][i])%7;
     89     }
     90     return 0;
     91 }
     92 int main(){
     93     init();
     94     int i,j,k,t,res;
     95     string st,ed;
     96     while(cin>>var>>equ){
     97         if(var==0&&equ==0) break;
     98         memset(an,0,sizeof(an));
     99         memset(x,0,sizeof(x));
    100         memset(free_x,1,sizeof(free_x));
    101         for(i=0;i<equ;i++){
    102             cin>>k>>st>>ed;
    103             t=p[ed]-p[st];
    104             t=(t%7+8)%7;
    105             an[i][var]=t;
    106             while(k--){
    107                 scanf("%d",&j);
    108                 an[i][j-1]++;
    109                 an[i][j-1]%=7;
    110             }
    111         }
    112         res=Gauss();
    113         if(res==0){
    114             for(i=0;i<var;i++){
    115                 if(x[i]<=2) x[i]+=7;
    116             }
    117             for(i=0;i<var-1;i++)
    118                 printf("%d ",x[i]);
    119             printf("%d
    ",x[i]);
    120         }
    121         else if(res==-1)
    122             printf("Inconsistent data.
    ");
    123         else printf("Multiple solutions.
    ");
    124     }
    125     return 0;
    126 }
    View Code
  • 相关阅读:
    JAVA 接口与抽象类(interface与abstract)的区别
    接口测试的测试点
    HTTP协议首部及Fiddler工具工作原理
    Android自动化测试AppiumLibrary库关键字
    蔬菜水果购买记
    健胃饮食
    榨汁机食谱
    随机权值平均
    周鸿祎IOT发布会思考
    Bilinear CNN与 Randomly Wired Neural Network
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3227168.html
Copyright © 2011-2022 走看看