BZOJ3112 ZJOI2013 防守戰線
阿新 • • 發佈:2018-12-10
傳送門 (消失的題面)
洛咕 (這裡還是有題面的233)
還是根據線性規劃列個柿子然後對偶一下就可以了
對偶一定想清楚行列(
附程式碼。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define inf 20021225 #define ll long long #define db double #define mxn 1010 #define mxm 10100 #define eps 1e-7 using namespace std; db M[mxn][mxm]; int n,m;// n行數 m列數 void privot(int x,int y) { db tmp=1.0/M[x][y];M[x][y]=1.0; for(int i=0;i<=m;i++) M[x][i]*=tmp; for(int i=0;i<=n;i++) { if(i==x||abs(M[i][y])<eps) continue; db t=M[i][y]; M[i][y]=0.0; for(int j=0;j<=m;j++) M[i][j]-=t*M[x][j]; } } bool simplex() { while(1) { int x=0,y=0;db mn=1e15; for(int i=1;i<=m;i++) if(M[0][i]>eps){y=i;break;} if(!y) return true; for(int i=1;i<=n;i++) if(M[i][y]>eps&&M[i][0]/M[i][y]<mn) mn=M[i][0]/M[i][y],x=i; if(!x){printf("Unbounded\n");return false;} privot(x,y); } } int main() { int l,r,v; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%lf",&M[i][0]); for(int i=1;i<=m;i++) { scanf("%d%d%d",&l,&r,&v);M[0][i]=v; for(int j=l;j<=r;j++) M[j][i]=1.0; } if(simplex()) printf("%.0lf\n",-M[0][0]); return 0; }