POJ 2976 Dropping tests【二分 最大化平均值】
2015-06-15 17:28
429 查看
题意:定义最大平均分为 (a1+a2+a3+---+an)/(b1+b2+---+bn),求任意去除k场考试的最大平均成绩
和挑战程序设计上面的最大化平均值的例子一样
判断是否存在x满足条件 (a1+a2+a3+---+an)/(b1+b2+---+bn)>=x
把这个不等式变形就得到
E(ai-x*bi )>=0
所以可以对ai-x*bi降序排序,取前n-k个,看它们的和是不是>=0(或者升序排,取后n-k个)
后来搜题解发现是01分数规划,列的式子好像都差不多-------
View Code
好饿~~(╯﹏╰)b
加油啊---------------goooooooooo----------
和挑战程序设计上面的最大化平均值的例子一样
判断是否存在x满足条件 (a1+a2+a3+---+an)/(b1+b2+---+bn)>=x
把这个不等式变形就得到
E(ai-x*bi )>=0
所以可以对ai-x*bi降序排序,取前n-k个,看它们的和是不是>=0(或者升序排,取后n-k个)
后来搜题解发现是01分数规划,列的式子好像都差不多-------
#include<iostream> #include<cstdio> #include<cstring> #include <cmath> #include<stack> #include<vector> #include<map> #include<set> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int INF = (1<<30)-1; const int mod=1000000007; const int maxn=10005; double a[maxn],b[maxn],y[maxn]; int n,k; int ok( double x){ for(int i=1;i<=n;i++) y[i]= a[i]-b[i]*x; sort(y+1,y+n+1); double ans=0; for(int i= k+1;i<=n;i++) ans+=y[i]; return ans>=0; } int main(){ while(scanf("%d %d",&n,&k)!=EOF){ 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 lb=0,ub=1.00,mid; for(int i=0;i< 100;i++){ mid=(lb+ub)/2; if(ok(mid)) lb=mid; else ub=mid; } printf("%d\n",(int)(100*lb+0.5)); } return 0; }
View Code
好饿~~(╯﹏╰)b
加油啊---------------goooooooooo----------
相关文章推荐
- Linux --shell(一)
- 【转】getopt分析命令行参数
- nginx源码分析之设计之美
- 【Java安全技术探索之路系列:Java可扩展安全架构】之七:JCE(三):JCE编程模型
- linux和win7下的软链接和硬链接
- 【Java安全技术探索之路系列:Java可扩展安全架构】之六:JCE(二):JCE类和接口
- 【Java安全技术探索之路系列:Java可扩展安全架构】之五:JCE(一):JCE架构介绍
- nginx + keepalived 实现HA 主从模式
- 人事维护——锐浪报表不能被IIS访问
- linux多线程编程(五)
- linux下tinyxml开发入门
- JAVA 获取linux的IP地址
- linux下ELK Stack的安装部署
- centos利用yum安装卸载软件常用命令
- linux 的文件系统(1)
- js 特校代码网站
- linux top指令
- linux的mount命令详解
- Linux 驱动之块设备结构体 (二)
- ubuntu15.04 nginx1.6.5 配置虚拟主机