版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/82846188
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int N,M,v1;
int v[505];
int a[505];
int f[51][501];// 2...i 号政党获得的席位为 j,留给 i+1 号政党的最大票数
bool check(int mid){
memset(f,0x3f,sizeof(f));
int t;
f[1][0]=0;
for(int i=2;i<N;i++)
for(int j=0;j<=M;j++)// 枚举 2...i 个政党总共获得的席位
for(int xi=0;xi<=j;xi++) // 枚举第 i 个政党获得的席位
if((t=v1*(xi+1)/mid-v[i]-f[i-1][j-xi])>=0)
f[i][j]=min(f[i][j],max(0,a[i]-t));
for(int j=0;j<=M;j++) // 枚举 2...N-1 个政党总共获得的席位并确认方案是否可行
if(j+(1ll*(f[N-1][j]+v[N])*mid-1)/v1<=M-mid)return 1;
return 0;
}
int main(){
scanf("%d%d%",&N,&M);
for(int i=1;i<=N;i++)scanf("%d",&v[i]);
for(int i=1;i<=N;i++)scanf("%d",&a[i]);
v1=v[1]+a[1]+a[N]; // 断环为链
int mid,L=0,R=M;
while(R>L){
mid=(L+R+1)>>1;
if(check(mid))L=mid;
else R=mid-1;
}
printf("%d",L);
return 0;
}
来源:zr