poj2976
2015-10-06 15:37
267 查看
说说思路吧。
我们假设a[i]+a[i+1]+…a[k]/(b[i]+b[i+1]+…b[k])=ans,那么得
(a[i]+a[i+1]+..a[k])-(b[i]+b[i+1]…+b[k]) *ans=0,题目要求的就是最大的ans,使得式子成立,我们二分这个ans (0< ans<1.0),针对每一个ans,我们计算出每一项a[i]-b[i]*ans的值,题目中又说了,舍去k项,而我们要使得剩下的n-k项的和尽量大(因为这样子才能让ans也相应变大),那么我们将所有a[i]-b[i]*ans排序,舍去最小的k项即可。
我们假设a[i]+a[i+1]+…a[k]/(b[i]+b[i+1]+…b[k])=ans,那么得
(a[i]+a[i+1]+..a[k])-(b[i]+b[i+1]…+b[k]) *ans=0,题目要求的就是最大的ans,使得式子成立,我们二分这个ans (0< ans<1.0),针对每一个ans,我们计算出每一项a[i]-b[i]*ans的值,题目中又说了,舍去k项,而我们要使得剩下的n-k项的和尽量大(因为这样子才能让ans也相应变大),那么我们将所有a[i]-b[i]*ans排序,舍去最小的k项即可。
#include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<iomanip> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> #include<map> #include<set> #include<bitset> //#define ONLINE_JUDGE #define eps 1e-5 #define INF 0x7fffffff #define FOR(i,a) for((i)=0;i<(a);(i)++) #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfI(a) printf("%I64d\n",a) #define pfs(a) printf("%s\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define sft(a,b,num) scanf("%d%d%d",&a,&b,&num) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define for3(i,a,b)for(int i=(b);i>=a;i--) #define MEM1(a) memset(a,0,sizeof(a)) #define MEM2(a) memset(a,-1,sizeof(a)) #define ll long long const double PI=acos(-1.0); template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} using namespace std; //#pragma comment(linker,"/STACK:1024000000,1024000000") int n,m,L; #define N 210 #define M 1000100 #define Mod 1000000000 #define p(x,y) make_pair(x,y) const int MAX_len=550; double a[1010]; double b[1010]; double c[1010]; int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif while(sfd(n,m)!=EOF && n+m){ for(int i=0;i<n;i++) scanf("%lf",&a[i]); for(int i=0;i<n;i++) scanf("%lf",&b[i]); double l=0,r=1; while(r-l>eps){ double mid = (l+r)/2; for(int i=0;i<n;i++) c[i] = a[i]-mid*b[i]; sort(c,c+n); double sum=0; for(int i=m;i<n;i++) sum += c[i]; if(sum>0) //sum越大,那么使得mid也会越大,最后的答案也就越大 l=mid; else r=mid; } printf("%.0f\n",l*100); } return 0; }
相关文章推荐
- wordpress 迁移
- Linux makefile 教程 非常详细,且易懂
- C#获取U盘序列号的方法
- 杂记 命令
- 动态链接库和静态链接库的区别
- 修改网卡名称
- Windows UWP开发系列 – MessageDialog 和 ContentDialog
- 写一个二维数组类 Array2
- vim编辑器
- C++学习--顶层Const与底层Const
- 杭州又添一家国有出租车“集团军”专车的服务
- 类型,对象,堆栈和托管堆
- zookeeper入门与实战
- git命令
- ListView用法
- hibernate双边的多对多关系
- Spring issue checking links
- 杭州出租车改革何以值得肯定
- 聚类与稀疏表示
- 九种破解Windows XP登录密码的方法