线性规划的裸题,然而蒟蒻并不会,放个代码慢慢研究QAQ
看线性规划的资料的话可以去找那个《线性规划与单纯形算法》
这里有个算法的模拟,可以加深理解
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10010;
const double eps=1e-7;
const int maxm=1010;
const int inf=1e10;
double a[maxn][maxm],b[maxn],c[maxn],ans=0;
int n,m;
void Pivot(int l,int e){
b[l]/=a[l][e];
for (int i=1;i<=n;i++)
if (i!=e) a[l][i]/=a[l][e];
a[l][e]=1.0/a[l][e];
for (int i=1;i<=m;i++)
if (i!=l&&fabs(a[i][e])>eps){
b[i]-=a[i][e]*b[l];
for (int j=1;j<=n;j++)
if (j!=e)
a[i][j]-=a[i][e]*a[l][j];
a[i][e]=-a[i][e]*a[l][e];
}
ans+=c[e]*b[l];
for (int i=1;i<=n;i++)
if (i!=e) c[i]-=c[e]*a[l][i];
c[e]=-c[e]*a[l][e];
}
double Simplex(){
int i,l,e;
while (true){
for (i=1;i<=n;++i) if (c[i]>eps) break;
if ((e=i)==n+1) return ans;
double tmp=inf;
for (i=1;i<=m;++i)
if (a[i][e]>eps&&b[i]/a[i][e]<tmp)
tmp=b[i]/a[i][e],l=i;
if (tmp==inf) return inf;
Pivot(l,e);
}
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i) scanf("%lf",&c[i]);
for (int i=1;i<=m;++i){
int l,r,w;
scanf("%d%d%d",&l,&r,&w);
for (int j=l;j<=r;++j) a[i][j]=1;
b[i]=w;
}
double ret=Simplex();
printf("%d",(int)(ret+0.5));
}