BZOJ3550 ONTAK2010 Vacation
阿新 • • 發佈:2018-12-10
傳送門(沒有是因為我沒有許可權號)
單純形暴力構造吼啊
對每個元素限制一下不能選多於一個 再對每N個元素限制一下不能多於K個
一共是3N+2N-1=5N-1個約束
跑就行了2333
(單純形在不需要ID的時候儘量不要寫 因為需要開N+M的空間 RE慘慘 非常容易忘)
附程式碼。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define inf 20021225 #define ll long long #define mxn 210 #define db double #define eps 1e-8 using namespace std; db M[mxn*6][mxn*3]; int n,m;//id[mxn*6]; void privot(int x,int y) { //swap(id[n+x],id[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; for(int j=0;j<=m;j++) M[i][j]-=M[x][j]*t; } } 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); } return true; } int main() { int nn,nnn,k; //freopen("9.in","r",stdin); scanf("%d%d",&nn,&k);nnn=3*nn;n=5*nn+1;m=nnn; for(int i=1;i<=nnn;i++) M[i][i]=M[i][0]=1.0;//3n for(int i=1;i<=nnn;i++) { scanf("%lf",&M[0][i]); if(i+nn-1<=nnn) { for(int j=0;j<nn;j++) M[i+nnn][i+j]=1.0; M[i+nnn][0]=k; } } if(simplex()) printf("%.0lf\n",-M[0][0]); return 0; }