Powerful Discount Tickets(贪心,数学)

题意

N件物品,每件物品价格为Ai元。

你现在有K张优惠券。对于一个价格为X的物品,如果你使用y张优惠券,则你需要花费X2y元。

求购买所有物品需要花费多少元钱?

题目链接:https://atcoder.jp/contests/abc141/tasks/abc141_d

数据范围

1N,K105

思路

我们可以观察一下X20X21X22的结果。我们可以发现变化幅度是减小的,也就是将优惠券用在价格更高的物品上更好。

因此,我们可以考虑每次使用一张优惠券,用在当前价格最高的物品上,然后该物品价格除以2。这个过程可以使用优先队列进行维护。

这个做法为什么是正确的呢?因为这里有一条性质:对于任意正整数X,b1,b2,有Xb1b2=Xb1b2

代码

#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;
}
posted @   pbc的成长之路  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示