BZOJ 3112 [Zjoi2013]防守战线

    xiaoxiao2021-03-25  139

    同 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; }
    转载请注明原文地址: https://ju.6miu.com/read-5828.html

    最新回复(0)