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),保留三位小数。
输入输出样例
说明
数据范围:
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; }