POJ2947-Widget Factory
阿新 • • 發佈:2018-05-02
factor mem -a tin 告訴 找不到 clas cto con
工廠裏每件期間的生產時間為3-9天,告訴你有N個器件和M個計劃,每個計劃都是說明生產1~N號器件的時間,最後問你每件器件的生產時間。或者多解或沒有解。
例如樣例
2 3 2 MON THU 1 2 3 MON FRI 1 1 2 3 MON SUN 1 2 2
其中 2 MON THU 說明下面有兩個器件是星期一到星期四生產的,所以有如下方程:(假設i號器件生產時間為xi)
x1+x2=4
x1+x1+x2=5
x1+x2+x2=7
很明顯求方程解可以用高斯消元法,算做一道高斯消元的練習題吧。
高斯消元就是通過初等行變化把矩陣化成階梯型矩陣,然後從低到頂求解每個變量的值。
註意如果某列對應的都是0,那麽求解下一列。
多解的情況就是矩陣的秩小於未知量的個數,因為那些未知量可以取任意的值。
沒有解就是得出秩行下面如果某個最後的常數不是0,那麽就是無解,因為沒有0=m這樣的解。
代碼如下:
#include <iostream> #include <string.h> #include <string> #include <map> using namespace std; int ma[333][333],n,m; int arr[233],ans; map<string,int> mp; int solve() { int i,j,k=1,l,tmp,num=0,sum; for(i=1;i<=m&&k<=n;++i){ //這裏i是當前第i行,k是當前第k列for(j=i;j<=m;++j) //找一個k列不是0的行 if(ma[j][k]) break; if(j>m){ //找不到那麽就處理下一個未知量 --i; ++k; continue; } if(j!=i){ swap(ma[i],ma[j]); } for(j=i+1;j<=m;++j){ if(!ma[j][k])continue; tmp=ma[j][k];//!!!這裏WA了,因為一開始沒有保存ma[j][k]的值,如果你不保存那麽ma[j][k]通過下面會變成0 for(l=k;l<=n+1;++l){ ma[j][l]=ma[i][l]*tmp-ma[j][l]*ma[i][k]; ma[j][l]=(ma[j][l]%7+7)%7; } } ++num; ++k; } sum=0; for(i=num+1;i<=m;++i) //找是否會無解 if(ma[i][n+1]) return 0; if(num!=n) //多解 return 1; for(i=n;i;--i){ //唯一解 for(j=i+1;j<=n;++j){ ma[i][n+1]=ma[i][n+1]-arr[j]*ma[i][j]; ma[i][n+1]=(ma[i][n+1]%7+7)%7; } arr[i]=0; for(j=3;j<=9;++j) if(ma[i][i]*j%7==ma[i][n+1]) arr[i]=j; } return 2; } int main(){ ios::sync_with_stdio(0); mp["MON"]=1; mp["TUE"]=2; mp["WED"]=3; mp["THU"]=4; mp["FRI"]=5; mp["SAT"]=6; mp["SUN"]=7; while(cin>>n>>m,n+m){ int k,x; string s1,s2; memset(ma,0,sizeof ma); for(int i=1;i<=m;++i){ cin>>k; cin>>s1>>s2; ma[i][n+1]=(mp[s2]-mp[s1]+1+7)%7; while(k--){ cin>>x; ma[i][x]++; ma[i][x]%=7; } } ans=solve(); if(ans==0) cout<<"Inconsistent data."<<endl; else if(ans==1) cout<<"Multiple solutions."<<endl; else for(int i=1;i<=n;++i) cout<<arr[i]<<" \n"[i==n]; } return 0; }
POJ2947-Widget Factory