[单纯形+对偶] BZOJ3265: 志愿者招募加强版

xiaoxiao2021-02-27  137

题意

题解

如果 这题 是用单纯形做的话,这题就没什么加强了…… 裸的线性规划。

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const double eps=1e-8; double a[10005][1005]; int n,m,id[20005]; void Pivot(int l,int e){ swap(id[n+l],id[e]); double t=a[l][e]; a[l][e]=1; for(int i=0;i<=n;i++) a[l][i]/=t; for(int i=0;i<=m;i++) if(i!=l&&fabs(a[i][e])>eps){ t=a[i][e]; a[i][e]=0; for(int j=0;j<=n;j++) a[i][j]-=t*a[l][j]; } } bool Simplex(){ while(1){ int l=0,e=0; double _min=1e+50; for(int i=1;i<=n;i++) if(a[0][i]>eps){ e=i; break; } if(!e) break; for(int i=1;i<=m;i++) if(-a[i][e]<-eps&&a[i][0]/a[i][e]<_min) _min=a[i][0]/a[i][e], l=i; if(!l) return false; Pivot(l,e); } return true; } int main(){ freopen("bzoj3265.in","r",stdin); freopen("bzoj3265.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%lf",&a[0][i]); for(int i=1;i<=m;i++){ int t,x,y; scanf("%d",&t); while(t--){ scanf("%d%d",&x,&y); for(int j=x;j<=y;j++) a[i][j]=1; } scanf("%lf",&a[i][0]); } for(int i=1;i<=n;i++) id[i]=i; Simplex(); printf("%d\n",(int)(-a[0][0]+0.5)); return 0; }
转载请注明原文地址: https://www.6miu.com/read-16728.html

最新回复(0)