璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:usaco20jan_berry_picking_s
problems
名称Berry Picking S
题目编号USACO20JAN_S1
题目链接luogu.com.cn/…
来源USACO
算法分类贪心
难易程度容易

Berry Picking S

想法

为了让大的k/2个篮子尽可能少,让小的k/2个篮子尽可能大,故大的k/2篮子尽可能统一比小的k/2中的最大值保持一致,故可以让k/2大的部分尽可能少。

枚举小的k/2部分中的最大值w,根据每个树对此最大值能装出多少整篮进行讨论。另该最大值能装cnt个篮子:

  1. 当 $ cnt \geq k $时,答案为 $\frac{k}{2} * w$。
  2. 当 $ cnt \geq \frac{k}{2}$时,答案为 $ (cnt - \frac{k}{2}) * w $ + 剩下最大的$k-w$篮子。
  3. 不考虑当$cnt < \frac{k}{2}$的情况,因为此时的w不是小的k/2的最大值。

代码实现

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
 
const int N = 1010;
int line[N];
 
int main() {
	int n, k, ans = 0, mx = 0;
	scanf("%d %d", &n, &k);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &line[i]);
		mx = max(line[i], mx);
	}
 
	for (int w = 1; w <= mx; ++w) {
		priority_queue<int>qu;
		int cnt = 0;
		for (int i = 1; i <= n; ++i) {
			cnt += line[i] / w;
			qu.push(line[i]%w);
		}
 
		if(cnt >= k) {
			ans = max(ans, k / 2 * w);
		}
		else if(cnt >= k/2) {
			int ans_temp = (cnt - k / 2) * w;
			for (int temp = 0; temp < k-cnt; ++temp){
				ans_temp += qu.top();
				qu.pop();
			}
			ans = max(ans, ans_temp);
		}
	}
 
	printf("%d", ans);
 
	return 0;
}
/app/www/public/data/pages/icpc/problems/usaco20jan_berry_picking_s.txt · 最后更改: 2023/06/10 14:35 由 温婕莺