BZOJ 3112 [Zjoi2013]防守战线

来源:互联网 发布:水晶之泉水坝重要数据 编辑:程序博客网 时间:2024/04/29 18:42

同 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;}
0 0