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个篮子:
- 当 $ cnt \geq k $时,答案为 $\frac{k}{2} * w$。
- 当 $ cnt \geq \frac{k}{2}$时,答案为 $ (cnt - \frac{k}{2}) * w $ + 剩下最大的$k-w$篮子。
- 不考虑当$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 由 温婕莺