Powerful Discount Tickets(贪心,数学)
题意
有件物品,每件物品价格为元。
你现在有张优惠券。对于一个价格为的物品,如果你使用张优惠券,则你需要花费元。
求购买所有物品需要花费多少元钱?
题目链接:https://atcoder.jp/contests/abc141/tasks/abc141_d
数据范围
思路
我们可以观察一下,,,的结果。我们可以发现变化幅度是减小的,也就是将优惠券用在价格更高的物品上更好。
因此,我们可以考虑每次使用一张优惠券,用在当前价格最高的物品上,然后该物品价格除以。这个过程可以使用优先队列进行维护。
这个做法为什么是正确的呢?因为这里有一条性质:对于任意正整数,有。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
int n, k;
int main()
{
priority_queue<int> que;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i ++) {
int x;
scanf("%d", &x);
que.push(x);
}
while(k --) {
int t = que.top();
que.pop();
que.push(t / 2);
}
ll ans = 0;
while(que.size()) {
int t = que.top();
ans += (ll)t;
que.pop();
}
printf("%lld\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】