poj之旅——2976C++
来源:互联网 发布:java api接口测试工具 编辑:程序博客网 时间:2024/05/02 02:17
二分法解决最大平均值的模式:
设[l,r)为可行区间,l表示最小可行数,r表示最大可能可行数,取mid,Check(mid)
,可行则l=mid,否则r=mid。
Check(mid):
设平均值为mid,如果可行的话,则有x=sum{a[i]}/sum{b[i]}最优解>mid,所以mid<=sum{a[i]}/sum{b[i]}
即mid*sum{b[i]}<=sum{a[i]}
sum{a[i]}-mid*sum{b[i]}>=0
sum{a[i]-mid*b[i]}>=
故定义新数组c[i]=a[i]-mid*b[i]
按照从大到小排序,选取前k个(k为所需数目)
若和大于零,表明Check(mid)可行。
参考程序:
#include<cstdio>#include<algorithm>#include<functional>#define maxn 2100using namespace std;long long a[maxn],b[maxn],c[maxn];int n,m;bool Check(int k){for (int i=0;i<n;i++)c[i]=a[i]-k*b[i];sort(c,c+n,greater<long long>());long long sum=0;for (int i=0;i<n-m;i++)sum+=c[i];return sum>=0;}int main(){while (scanf("%d%d",&n,&m)==2 && (n || m)){for (int i=0;i<n;i++){scanf("%lld",&a[i]);a[i]*=10000;}for (int i=0;i<n;i++)scanf("%lld",&b[i]);int l=0,r=10001;while (l+1<r){int mid=(l+r)>>1;if (Check(mid))l=mid;else r=mid;}printf("%.0f\n",l/100.0);}return 0;}
1 0
- poj之旅——2976
- poj之旅——2976C++
- poj之旅——3258
- poj之旅——3273
- poj之旅——3104
- poj之旅——3045
- poj之旅——3111。
- poj之旅——3579
- poj之旅——1979
- poj之旅——3009
- poj之旅——3669
- poj之旅——2718
- poj之旅——3187
- poj之旅——3050
- poj之旅——2376
- poj之旅——1328
- poj之旅——3190
- poj之旅——2393
- C# 应用程序域和程序集
- 一个线程的独白
- SQL Server 2008 txt格式数据导出
- C++面向对象技术
- 类中成员函数声明后面的const的含义!
- poj之旅——2976C++
- math
- windows加入tomcat服务与参数配置
- mac下编译java+tomcat出现javax.servlet 不存在
- ubuntu 正在读取软件包列表... 有错误!
- PHP语言优势
- 算法导论第二章-算法基础-Cpp代码实现
- consul(第二篇)consul Ops
- Jquery 获取 radio/select/checkbox 选中值