列表

详情


NC14662. 小咪买东西

描述

nk西/=max西

输入描述

多组数据。
第一行一个整数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;
	}
}

上一题