NC14662. 小咪买东西
描述
输入描述
多组数据。第一行一个整数T,为数据组数。接下来有T组数据。对于每组数据,第一行两个正整数n,k,如题。接下来n行,每行有两个正整数ci,vi。分别为手办的花费和它对于小咪的价值。
输出描述
对于每组数据,输出一个数,即能得到的总价值/总花费的最大值。精确至整数。
示例1
输入:
1 5 1 1 2 2 3 3 4 4 5 5 6
输出:
2
Python3 解法, 执行用时: 693ms, 内存消耗: 7588K, 提交时间: 2023-08-02 11:45:58
T = int(input()) for _ in range(T): n, k = map(int, input().split()) dolls = [list(map(int, input().split())) for _ in range(n)] l, r = 0, max([v/c for c, v in dolls]) while r - l > 1e-5: mid = (l + r) / 2 dolls.sort(key=lambda x: x[1] - mid * x[0], reverse=True) sum = 0 for i in range(k): sum += dolls[i][1] - mid * dolls[i][0] if sum >= 0: l = mid else: r = mid print(int(l))
C++11(clang++ 3.9) 解法, 执行用时: 73ms, 内存消耗: 852K, 提交时间: 2020-05-23 23:01:58
#include<iostream> #include<algorithm> using namespace std; int T,n,k,a[10003],b[10003],c[10003]; int main() { cin>>T; while(T--) { cin>>n>>k; for(int i=1;i<=n;i++) cin>>b[i]>>a[i]; int l=0,r=10000; while(l<r) { int mid=l+r+1>>1; long long sum=0; for(int i=1;i<=n;i++) c[i]=a[i]-mid*b[i]; sort(c+1,c+n+1); for(int i=1;i<=k;i++) sum+=c[n+1-i]; if(sum>=0) l=mid; else r=mid-1; } cout<<l<<endl; } }