数学(线性规划): ZJOI2013 防守战线

  偷懒用的线性规划。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int maxr=1010;
 6 const int maxc=10010;
 7 
 8 int n,m,nxt[maxc];
 9 int a[maxr][maxc];
10 
11 
12 void Pivot(int l,int e){
13     int pre=maxc-1;
14     for(int i=0;i<=n;i++)
15         if(a[l][i]!=0){nxt[pre]=i;pre=i;}
16     nxt[pre]=-1;
17             
18     for(int i=0,t;i<=m;i++)
19         if(i!=l&&(t=a[i][e])){
20             a[i][e]=0;
21             for(int j=nxt[maxc-1];j!=-1;j=nxt[j])
22                 a[i][j]+=t*a[l][j];
23         }
24 }
25 
26 void Simplex(){
27     while(true){
28         int e=0,l=0;
29         for(int i=1;i<=n;i++)
30             if(a[0][i]>0){e=i;break;}
31         if(e==0)break;        
32         for(int i=1;i<=m;i++)
33             if(a[i][e]<0&&(!l||a[l][0]>a[i][0]))
34                 {l=i;}
35         
36         Pivot(l,e);    
37     }
38 }
39 
40 int main(){
41 #ifndef ONLINE_JUDGE
42     freopen("zjoi13_defend.in","r",stdin);
43     freopen("zjoi13_defend.out","w",stdout);
44 #endif
45     scanf("%d%d",&m,&n);
46     for(int i=1;i<=m;i++)
47         scanf("%d",&a[i][0]);
48     for(int i=1,l,r,t;i<=n;i++){
49         scanf("%d%d%d",&l,&r,&t);
50         for(int j=l;j<=r;j++)
51             a[j][i]=-1;
52         a[0][i]=t;
53     }
54     Simplex();
55     printf("%d
",a[0][0]);
56     return 0;    
57 }
原文地址:https://www.cnblogs.com/TenderRun/p/5615510.html