protagonist

KC喝咖啡

题目背景

KC喝咖啡

题目描述

话说KC和SH在福州的时候常常跑去85°C喝咖啡或者其他的一些什么东西。

这天,KC想要喝一杯咖啡,服务员告诉他,现在有n种调料,这杯咖啡只可以加入其中的m种(当然KC一定会加入m种,不会加入少于m种的调料),根据加入的调料不同,制成这杯咖啡要用的时间也不同,得到的咖啡的美味度也不同。

KC在得知所有的n种调料后,作为曾经的化竞之神的他,马上就知道了所有调料消耗的时间ci以及调料的美味度vi。由于KC急着回去刷(play)题(games),所以他想尽快喝到这杯咖啡,但他又想喝到美味的咖啡,所以他想出了一个办法,他要喝到(Σvi)/(Σci)最大的咖啡,也就是单位时间的美味度最大的咖啡。

现在,KC把调料信息告诉了SH,要SH帮他算出喝到的咖啡的(Σvi)/(Σci),但SH不想帮KC算这东西,于是KC就只能拜托你来算了。

注释:Σ表示求和,所以(Σvi)/(Σci)表示 美味度的总和 除以 消耗时间的总和。

输入输出格式

输入格式:

 

输入数据第一行为一个整数n,m,表示调料种数和能加入的调料数。接下来2行,每行为n个数,第一行第i个整数表示调料i的美味度vi,第二行第i个整数表示调料i消耗的时间ci。

 

输出格式:

 

一个整数T,表示KC喝的咖啡的最大(Σvi)/(Σci),保留三位小数。

 

输入输出样例

输入样例#1: 复制
3 2
1 2 3
3 2 1
输出样例#1: 复制
1.667
(选2号和3号调料,(2+3)/(2+1)=1.667)

说明

数据范围:

20%:1<=n<=5。

50%:1<=n<=10。

80%:1<=n<=50。

100%:1<=n<=200,1<=m<=n,1<=c[i],v[i]<=10000。

保证答案不超过1000。

#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i <= (b); ++ i)
#define REP(j, a, b) for(int j = (a); j <= (b); ++ j)
#define PER(i, a, b) for(int i = (a); i >= (b); -- i)
using namespace std;
const int maxn=1e5+5;
template <class T>
inline void rd(T &ret){
    char c;
    ret = 0;
    while ((c = getchar()) < '0' || c > '9');
    while (c >= '0' && c <= '9'){
        ret = ret * 10 + (c - '0'), c = getchar();
    }
}
struct node{
    int v,c;
    double val;
}p[maxn];
int n,m;
double l,r,mid;
bool comp(node a,node b){
          return a.val>b.val;
}
bool ok(double cur){
    double tot=0.0;
    REP(i,1,n)p[i].val=p[i].v-cur*(double)p[i].c;
    sort(p+1,p+1+n,comp);
    REP(i,1,m){
       tot+=p[i].val;
    }
    if(tot>=0)return true;
    else return false;
}
int main()
{
    rd(n),rd(m);
    REP(i,1,n)rd(p[i].v);
    REP(i,1,n){
        rd(p[i].c);
        r=max(r,p[i].v*1.0/(double)p[i].c);
    }
    while(r-l>1e-6){
        mid=(l+r)/2.0;
        if(ok(mid))l=mid;
        else r=mid;
    }
    printf("%.3f",l);
    return 0;
}

 

posted @ 2019-03-03 18:26  czy-power  阅读(249)  评论(0编辑  收藏  举报