席位选举

版权声明:未经过同意不得转载 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

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/82846188
今日推荐