同 noi 2008 志愿者招募,把基变量和非基变量改改就行了;
ps:这题要用 long long
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std; const int maxn=100010; const double inf = 10000000000000.00; int n,m,x,y,z; double a[1100][10100],b[1010],c[10100],v; double eps=1e-7; inline void pivot(int l,int e){ int i,j; b[l]/=a[l][e]; for(i=1;i<=n;i++) if(i!=e) a[l][i]/=a[l][e]; a[l][e]=1/a[l][e]; for(i=1;i<=m;i++)if(i!=l&&fabs(a[i][e])>eps){ b[i]-=a[i][e]*b[l]; for(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]; } v+=c[e]*b[l]; for(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(1) { for(i=1;i<=n;i++) if(c[i]>eps) break; if((e=i)==n+1) return v; double temp=inf; for(i=1;i<=m;i++) if(a[i][e]>eps&&b[i]/a[i][e]<temp) temp=b[i]/a[i][e],l=i; if(temp==inf) return inf; pivot(l,e); } } int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) scanf("%lf",&b[i]); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); for(int j=x;j<=y;j++) { a[j][i]=1; } scanf("%lf",&c[i]); } double ans=Simplex(); printf("%lld\n",(long long)(ans+0.5)); return 0; }