【基础01分数规划】POJ 2976 Dropping tests
题目大意:
给定$n$个数,每个数都有$a[i]$和$b[i]$值,现在要你从这$n$个数中挑$n-k$个数,使得$100*\frac{\sum_{i=1}^{n}{ai}}{\sum_{i=1}^{n}{ai}}$最大。
解题分析:
01分数规划入门题,具体思路过程见进阶指南。大概过程就是,通过二分答案,枚举这个最大值$mid$,然后比较$\sum_{i=1}^{n}(a_i-mid*b_i)$与0的大小即可,注意控制精度。
#include <cstdio> #include <algorithm> #include <iostream> using namespace std; const double eps = 1e-4; const int N = 1e3+5; double a[N],b[N],c[N]; bool cmp(double t1,double t2){ return t1>t2; } int main(){ while(true){ int n,k;cin>>n>>k; if(n==0&&k==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.0,r=1.0,mid; while(r-l>eps){ mid=(l+r)/2; double sum=0.0; for(int i=1;i<=n;i++)c[i]=a[i]-mid*b[i]; sort(c+1,c+1+n,cmp); for(int i=1;i<=n-k;i++)sum+=c[i]; //选择最大的n-k个 if(sum>=0)l=mid; else r=mid; } printf("%.0lf\n",100*mid); } }
【最优比率生成树】POJ 2728 Desert King (模板题)