题目链接:点击打开链接
二分搜索答案。
若 某些a[i]的和/某些b[i]的和>=x; 则某些a[i]的和-这些b[i]*x的和>=0 ;这样只要从大到小选n-k个a[i]-b[i]*x求和,如果和大于等于0就可行(这个公式其实很好理解)
根据这个公式去2分搜索答案即可
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define eps 1e-7
#include <algorithm>
using namespace std;
int a[1005];
int b[1005];
double p[1005];
int n,k;
bool cmp(double a,double b){
return a>b;
}
bool C(double mid){
for(int i=1;i<=n;i++){
p[i]=a[i]-mid*b[i];
}
sort(p+1,p+n+1,cmp);
double sum=0;
for(int i=1;i<=k;i++){
sum+=p[i];
}
if(sum>=0) return 1;
return 0;
}
int main(){
while(~scanf("%d%d",&n,&k),n){
k=n-k;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
}
double l=0,r=1;
double mid;
while(r-l>eps){
mid=(r+l)/2;
if(C(mid)) l=mid;
else r=mid;
}
printf("%.0f\n",100*(mid+eps));
}
return 0;
}
本文介绍了一种利用二分搜索算法解决特定问题的方法。通过给定的a[i]和b[i]数组,寻找一个阈值x,使得a[i]的和减去b[i]乘以x的和大于等于0。文章提供了详细的算法实现思路及C++代码示例。

被折叠的 条评论
为什么被折叠?



