题目大意: 给定两个长度为n的数组a,b.从中选出n-k个数使得sigema ai /sigema bi 最大。
题目分析:(0/1分数规划) 0/1分数规划传送门 一道裸题。 二分答案,算出d数组,从大往小取n-m个,判断F[L]。
代码如下(传送门对面貌似是Pascal选手=。=,c++版本如下供参考):
#include <cstdio> #include <algorithm> #include <iostream> #define N 1200 using namespace std; const double EPS=1e-5; int n,m; double a[N],b[N]; double d[N]; int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0 && m==0) break; for(int i=1;i<=n;i++) scanf("%lf",&a[i]); for(int i=1;i<=n;i++) scanf("%lf",&b[i]); double l=0,r=0; for(int i=1;i<=n;i++) r=(a[i]/b[i]>r)?(a[i]/b[i]):r; while((r-l)>EPS) { double mid=(l+r)/2,tmp=0; for(int i=1;i<=n;i++) d[i]=a[i]-mid*b[i]; sort(d+1,d+1+n); for(int i=n;i>m;i--) tmp+=d[i]; if(tmp>0) l=mid; else r=mid; } printf("%1.lf\n",l*100.0); } return 0; }