Codeforces 976E Well played! [贪心]

本文介绍了一道编程题的解决思路及AC代码实现。题目要求通过两种操作使一组物品的特定属性值之和达到最大。文章提供了详细的算法思路,并附带完整的C++代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给你n个物品,每个物品有两个属性h,d,有两种操作
1. 让某个物品h=h*2
2. 让某个物品d=h
两个操作的数量分别是a,b,求所有物品总的d的和最大值

题解

首先,我们可以简单得出,加倍肯定要加在同一个物品上,于是我们只要枚举加倍到哪个物品上,计算总和即可。

AC代码

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
    ll h,d;
}q[200005];
bool cmp(node a,node b)
{
    return a.h-a.d>b.h-b.d;
}
int main()
{
    ll n,a,b;
    scanf("%lld%lld%lld",&n,&a,&b);
    ll sum=0;
    for(ll i=1;i<=n;i++)
        scanf("%lld%lld",&q[i].h,&q[i].d);
    sort(q+1,q+n+1,cmp);
    ll di=1;
    while(a)di*=2,a--;
    for(ll i=1;i<=b;i++)
        sum+=max(q[i].h,q[i].d);
    for(ll i=b+1;i<=n;i++)
        sum+=q[i].d;
    ll ans=sum;
    for(ll i=1;i<=b;i++)
        ans=max(ans,sum-max(q[i].h,q[i].d)+max(q[i].h*di,q[i].d));
    if(b!=0)
        for(ll i=b+1;i<=n;i++)
            ans=max(ans,sum-q[i].d+max(q[i].h*di,q[i].d)-max(q[b].h,q[b].d)+q[b].d);
    printf("%lld\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值