编程俱乐部天梯程序设计选拔赛div2 最后一贪心题

题目背景
mxj是M商店的老板,最近他突然获得了两项超能力:

1.预知未来nn天中第ii天所拥有的物品数量ai 以及第i天要来你商店的顾客人数bi
2.可以让最多kk天的物品数量翻一倍。(每一天只能翻一次)

题目描述
问:身为老板的你,在这nn天内最多可以卖出多少件物品?

输入输出格式
输入格式:
第一行输入 n ,k,分别代表未来 n 天,可最多让 k 天的物品翻一倍。

接下来 n行,第 i 行输入 ai,bi 。分别代表 第ii天所拥有的货物数量ai以及 第i天要来你商店的顾客人数 bi
输出格式:
在这n天内最多可以卖出物品的数量

输入输出样例

输入样例#1:
4 2
2 1
3 5
2 3
1 5
输出样例#1:
10

可以让 第2天 和 第4天 的物品数量翻一倍。所以物品数量为【2,6,2,2】。总共卖出 1 + 5 + 2 + 2 = 10 件物品。
输入样例#2: 复制
4 1
0 2
0 3
3 5
0 6
输出样例#2: 复制
5
说明
注意:

1.每位来商店的顾客都会买一件物品。(当天所卖物品的数量 = min(顾客数量,当前物品数量))

2.第ii天货物只能在第ii天卖。

$1 ≤ n ≤ 10_5$
$0 ≤ k ≤ n$

$0 ≤  a_i , b_i ≤ 10_9$

题意就是

有n天,接下来n行,每行两个数:分别是这一天商店的物品数量和顾客的数量,
毛学姐有一个超能力,就是可以使k天的物品数*2
求n天的可以卖掉的物品数的最大值

思路:

简单贪心, 边输入边处理 ,然后对跨度进行排序,求和即可。
第i天的物品数可以是0啊,0乘2就没用。。注意哦

毛学姐代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
int tot=0;

int main()
{
    int n,k;
    cin >> n >> k;
    ll sum=0;
    for(int i = 0;i < n; i++){
        ll u, v;
        cin >> u >> v;
        if(v > u)
            a[tot++]=min(u,v-u);     //用a数组存储 *2之后 可以使答案增加 的数
            
        sum+=min(u,v);      //先求个和,求不*2的话,可以卖掉的物品数的值
    }
    sort(a,a+tot);    //排序
    for(i=tot-1;i>=0 && k ;i--)       //i--,还要控制k没减到0
    {
        sum+=a[i];
        k--;
    }
    printf("%lld\n",sum);
}

我的AC代码:(后来刷了半天才找到,不容易啊)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43250284/article/details/88405238
今日推荐