这是一道模板题。

本题中你需要求解一个标准型线性规划:

i∑j=1naijxj≤bi。

此外这0xj≥0。

在满足上述所有条件的情况下,你需要指定每个变量jF=∑j=1ncjxj的值最大。

输入格式

第一行三个正整数 }t∈{0,1}。

第二行有nc1,c2,⋯,cn,整数间均用一个空格分隔。

接下来iai1,ai2,⋯,ain,bi,整数间均用一个空格分隔。

输出格式

如果不存在满足所有约束的解,仅输出一行"Infeasible"。

如果对于任意的

否则,第一行输出一个实数,表示目标函数的最大值610−6,你的答案被判为正确。

如果nx1,x2,⋯,xn的取值,如有多组方案请任意输出其中一个。

判断第二行是否合法时,我们首先检验610−6,则判为正确。

如果0t=0,或者出现Infeasible或Unbounded时,不需要输出第二行。

样例一

input

2 2 1
1 1
2 1 6
-1 2 3

output

4.2
1.8 2.4 

explanation

两条约束分别为32x1+x2≤6,−x1+2x2≤3。

4.24.2。

样例二

input

2 2 1
1 -1
1 1 4
-1 -2 -2

output

4.0
4.0 0.0

explanation

注意0xj≥0的限制。

样例三

input

3 3 1
0 0 1
-2 1 0 -4
1 1 0 4
1 -2 0 -4

output

Infeasible

样例四

input

2 1 1
0 1
1 0 1

output

Unbounded

限制与约定

对于所有数据,}t∈{0,1}。

本题包含4个子任务,每个25分。

子任务1,3满足0bi≥0。

子任务2,4没有特殊限制。

子任务1,2中0t=0。

子任务3,4中1t=1。

时间限制:s1s

空间限制:MB

正解:线性规划模板。

看了各种博客论文,现在还不是很理解。

板子参见xlightgod学长,话说完全蒯代码真的好吗。。然而我把ctime和srand去掉了才AC。。

学长的两篇博客:

http://blog.xlightgod.com/%E3%80%90uoj179%E3%80%91%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92/

http://blog.xlightgod.com/%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92%E4%B8%8E%E5%8D%95%E7%BA%AF%E5%BD%A2%E6%B3%95/

 

 1 //It is made by wfj_2048~
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <complex>
 5 #include <cstring>
 6 #include <cstdlib>
 7 #include <cstdio>
 8 #include <vector>
 9 #include <cmath>
10 #include <queue>
11 #include <stack>
12 #include <map>
13 #include <set>
14 #define eps (1e-12)
15 #define inf (1e15)
16 #define il inline
17 #define RG register
18 #define double long double
19 
20 using namespace std;
21 
22 double a[50][50],val[50],ans;
23 int L[50],E[50],b[50],n,m;
24 
25 il int gi(){
26     RG int x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();
27     if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x;
28 }
29 
30 il void pivot(RG int l,RG int e){
31     swap(L[l],E[e]); RG double k=a[l][e]; a[l][e]=1;
32     for (RG int i=0;i<=n;++i) a[l][i]/=k; RG int len=0;
33     for (RG int i=0;i<=n;++i) if (fabs(a[l][i])>eps) b[++len]=i;
34     for (RG int i=0;i<=m;++i)
35     if (i!=l && fabs(a[i][e])>eps){
36         k=a[i][e],a[i][e]=0;
37         for (RG int j=1;j<=len;++j) a[i][b[j]]-=k*a[l][b[j]];
38     }
39     return;
40 }
41 
42 il double simplex(){
43     while (1){
44     RG int l,e; for (e=1;e<=n;++e) if (a[0][e]>eps) break;
45     if (e==n+1) return -a[0][0]; RG double tmp=inf;
46     for (RG int i=1;i<=m;++i)
47         if (a[i][e]>eps && a[i][0]/a[i][e]<tmp) tmp=a[i][0]/a[i][e],l=i;
48     if (tmp==inf) return inf; pivot(l,e);
49     }
50 }
51 
52 il int init(){
53     for (RG int i=1;i<=n;++i) E[i]=i;
54     while (1){
55     RG int l=0,e=0;
56     for (RG int i=1;i<=m;++i) if (a[i][0]<-eps && (!l || (rand()&1))) l=i; if (!l) return 1;
57     for (RG int i=1;i<=n;++i) if (a[l][i]<-eps && (!e || (rand()&1))) e=i; if (!e) return 0;
58     pivot(l,e);
59     }
60 }
61 
62 il void work(){
63     n=gi(),m=gi(); RG int t=gi();
64     for (RG int i=1;i<=n;++i) scanf("%Lf",&a[0][i]);
65     for (RG int i=1;i<=m;++i){
66     for (RG int j=1;j<=n;++j) scanf("%Lf",&a[i][j]);
67     scanf("%Lf",&a[i][0]);
68     }
69     if (!init()){ puts("Infeasible"); return; } ans=simplex();
70     if (ans==inf) puts("Unbounded"); else{
71     printf("%0.8Lf\n",ans); if (!t) return;
72     for (RG int i=1;i<=m;++i) val[L[i]]=a[i][0];
73     for (RG int i=1;i<=n;++i) printf("%0.8Lf ",val[i]);
74     }
75     return;
76 }
77 
78 int main(){
79     work();
80     return 0;
81 }

 

相关文章:

  • 2022-02-24
  • 2022-01-11
  • 2021-11-11
  • 2021-06-20
  • 2021-09-07
  • 2021-09-03
  • 2021-11-27
猜你喜欢
  • 2022-01-18
  • 2021-07-04
  • 2022-12-23
  • 2022-01-24
  • 2021-11-25
  • 2021-08-29
相关资源
相似解决方案