2.摘桃子


Description


丹枫花园的果树成熟啦!

今年春天果农一共栽了 n 颗桃树,已知第 i 颗桃树将会在第 ai 天成熟 bi 颗又红油润的水蜜桃。但是因为天气炎热的缘故,水蜜桃太容易坏了,果实只有在刚成熟的当天(第 ai 天)和第二天(第 ai+1 天)才适合采摘,否则将会缩水,即使摘下来也不好吃了。

龙龙现在是丹枫花园的果农,但是他并没有特别地强壮,因此他每天的力气只够他采摘 v 颗桃子。这些摘下来的桃子既可以来自同一颗果树,也可以来自不同的果树。

但是龙龙太喜欢吃桃子了,因此他想摘尽可能多这样甜甜的水蜜桃来吃,聪明的你能告诉他这些天最多能摘下几颗桃子吗?

Input

第一行输入两个正整数 n、v 空格(1 ≤ n,v ≤ 3000),表示果树颗数和龙龙每天最多能采摘的桃子个数;

接下来 n 行,每行输入两个正整数,其中第 i 行输入 ai 和 bi(1 ≤ ai,bi ≤ 3000)表示第 i 颗果树有 bi 颗桃子,将在第 ai 天成熟

Output

输出一个正整数,表示龙龙这些天最多能摘下的桃子数量。

Hint

对于第一个样例,龙龙可以按这样的顺序摘桃子:

·第一天龙龙从第一颗果树上摘下 3 颗桃子,剩下的桃子已经不能摘了,因为每天最多只能摘 3 颗水蜜桃;
·第二天龙龙从第一颗果树上摘下 2 颗桃子,并从第二颗果树上摘下 1 颗桃子;
·第三天龙龙从第二颗果树上摘下剩余的 2 颗桃子;

到此龙龙总共摘得了8颗甜美的水蜜桃。


思路

该题重要的是一天结的桃子数量,而不是哪一颗树结的桃子。

因此,我们需要利用数组记录每天结的桃子数量。

接着我们应该按照天数从小到大,依次求出每天能摘到的桃子数量。

因为桃子只能在当天和前一天被摘下,因此我们每天应该优先摘下前一天桃子,尽可能不浪费,如果能摘桃子的数量不为0,再摘取当天的桃子。

注意事项

1.不要让数组越界,大小至少3001。

2.记录最大天数maxDay,以免后续遍历到并没有结桃子的日子。

3.遍历每一天摘桃情况时,实际上要遍历最大天数+1天,因为最后一天虽然不结桃子但仍然可以摘前一天的桃子。

整体代码

(BIT的同学如若借鉴,记得稍微修改一点,有查重)

#include <stdio.h>  
  
int main() {  
    int n, v;  
    scanf("%d %d", &n, &v);  
    int a = 0, b = 0, day[3001] = { 0 };  
    int pick = v;  
    int i = 0, maxDay = 0;  
    int sum = 0;  
    while (n--) {  
        scanf("%d %d", &a, &b);  
        if (a >= 0 && a <= 3000) {  
            day[a] += b;  
        }  
        if (a > maxDay) {  
            maxDay = a;  
        }  
    }  
  
    for (i = 1; i <= maxDay+1; i++) {  
  
            if (day[i - 1]) {  
                if (v >= day[i - 1]) {  
                    sum += day[i - 1];  
                    v -= day[i - 1];  
          
                }  
                else {  
                    sum += v;  
                    v = 0;  
                }  
            }  
                if (v&&day[i]) {  
                    if (v >= day[i]) {  
                        sum += day[i];  
                        day[i] = 0;  
                    }  
                    else {  
                        sum += v;  
                        day[i] -= v;  
  
                          
                    }  
                }  
                v = pick;  
            }  
        printf("%d\n", sum);  
        return 0;  
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榆榆欸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值