生活随笔
收集整理的這篇文章主要介紹了
hihoCoder #1195 : 高斯消元·一
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間限制:10000ms 單點時限:1000ms 內存限制:256MB
描述
小Ho:喂不得了啦,那邊便利店的薯片半價了!
小Hi:啥?!
小Ho:那邊的便利店在打折促銷啊。
小Hi:走走走,趕緊去看看=v=
于是小Hi和小Ho來到了便利店。
老板為了促銷,推出了組合包的形式,將不同數量的各類商品打包成一個組合,顧客可以選擇組合進行購買。比如2袋薯片,1聽可樂的組合只要5元,而1袋薯片,2聽可樂的組合只要4元。
通過詢問老板,小Hi和小Ho知道:一共有N種不同的商品和M種不同的商品組合;每一個組合的價格等于組合內商品售價之和,一個組合內同一件商品不會超過10件。
小Hi:這樣算下來的話,一聽可樂就是1元,而一包薯片是2元。小Ho,如果你知道所有的組合情況,你能分別算出每一件商品單獨的價格么?
小Ho:當然可以了,這樣的小問題怎么能難到我呢?
? ?
提示:高斯消元
?
輸入
第1行:2個正整數,N,M。表示商品的數量N,組合的數量M。1≤N≤500, N≤M≤2*N
第2..M+1行:N+1個非負整數,第i+1行第j列表示在第i個組合中,商品j的數量a[i][j]。第i+1行第N+1個數表示該組合的售價c[i]。0≤a[i][j]≤10, 0≤c[i]≤10^9
輸出
若沒有辦法計算出每個商品單獨的價格,輸出"No solutions"
若可能存在多個不同的結果,輸出"Many solutions"
若存在唯一可能的結果,輸出N行,每行一個非負整數,第i行表示第i個商品單獨的售價。數據保證如果存在唯一解,那么解一定恰好是非負整數解。
樣例輸入
2 2
2 1 5
1 2 4 樣例輸出21
這坑爹oj沒數據,害的我拍了以上午,題比較簡單,高斯消元的模板題,注意eps要開double類型的 1 #include<cstdio>
2 #include<cstring>
3 #include<cmath>
4 #include<algorithm>
5 using namespace std;
6 const int MAXN=
1001;
7 const double eps =1e-
7;
8 typedef
double Matrix[MAXN][MAXN] ;
9 inline
void read(
int &
n)
10 {
11 char c=getchar();
bool flag=
0;n=
0;
12 while(c<
'0'||c>
'9') c==
'-'?flag==
1,c=getchar():c=
getchar();
13 while(c>=
'0'&&c<=
'9') n=n*
10+c-
48,c=
getchar();
14 }
15 int n,m;
16 Matrix a;
17 double t[MAXN];
18 void Gauss()
19 {
20 int r;
21 for(
int i=
1;i<=n;i++)
// 枚舉每一行
22 {
23 r=
i;
24 for(
int j=m;j>=i+
1;j--)
// 枚舉后面的行
25 fabs(a[j][i])>fabs(a[r][i])?r=j:r=
r;
26 if(r!=
i) swap(a[r],a[i]);
27 if(r==i&&fabs(a[i][i])<eps) printf(
"Many solutions"),exit(
0);
28
29 for(
int j=i+
1;j<=m;j++)
// 行
30 {
31 for(
int k=n+
1;k>i;k--)
// 列
32 a[j][k]-=(a[j][i]/a[i][i])*
a[i][k];
33 a[j][i]=
0;
34 }
35 }
36
37 for(
int i=n,j;i<=m;i++
)
38 {
39 for(j=
1;j<=n;j++)
if(fabs(a[i][j])>eps)
break;
40 if(j==n+
1&&fabs(a[i][n+
1])>
eps)
41 printf(
"No solutions\n"),exit(
0);
42 }
// 是否有解
43
44 for(
int i=n;i>=
1;i--)
// 枚舉行
45 {
46 for(
int j=i+
1;j<=n;j++)
// 枚舉列
47 a[i][n+
1]-=a[i][j]*a[j][n+
1];
48 a[i][n+
1]/=
a[i][i];
49 }
50 for(
int i=
1;i<=n;i++
)
51 printf(
"%d\n",(
int)(a[i][n+
1]+
0.5));
52 }
53 int main()
54 {
55 freopen(
"a.in",
"r",stdin);
56 freopen(
"c.out",
"w",stdout);
57 read(n);read(m);
58 for(
int i=
1;i<=m;i++
)
59 for(
int j=
1;j<=n+
1;j++
)
60 scanf(
"%lf",&
a[i][j]);
61 Gauss();
62
63 return 0;
64 }
?
總結
以上是生活随笔為你收集整理的hihoCoder #1195 : 高斯消元·一的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。