2.摘桃子

Description

丹枫花园的果树成熟啦!

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

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

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

Input

第一行输入两个正整数n,v ,表示果树颗数和龙龙每天最多能采摘的桃子个数;

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

Output

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

Hint

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

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

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

测试输入期待输出
2 3
1 5
2 3
8
5 10
3 20
2 20
1 20
4 20
5 20
60
解题思路: 

使用a[x]来表示第x天成熟a[x]个桃子(可能不同的树同一天成熟,累加一下)。

在循环中,我用a[j]表示第j天成熟的,d1表示第j-1天剩下的(d1<=v),d2表示第j天剩下的(d2=0)。也就是要优先采摘d1,再判断能给d2剩多少。下一次循环开始前,d1=d2,d2归0。

代码:
#include<stdio.h>
main()
{
	int n,v,a[3001]={0},i,j,sum;
	scanf("%d %d",&n,&v);
	
	int x,y;
	for(i=0;i<n;i++){
		scanf("%d %d",&x,&y);
		a[x]+=y;//第x天成熟y个
	}

	j=0;//i棵果树,第j天
	int d1=0,d2=0;//j-1天剩余(d1<=v),j天剩余
	for(j=0;j<3001;j++){
		if(a[j]==0) {
			sum+=d1;
			d1=0;
			continue;
		}
		switch((a[j]+d1)/v){
			case 0:d1+=a[j];break;            //a[j]+d1<v
			case 1:d2=d1+a[j]-v;d1=v;break;   //v<a[j]+d1<2v
			default:d1=v;d2=v;                //a[j]+d1>2v
		}
		sum+=d1;
		d1=d2;
		d2=0;
	}
	
	printf("%d\n",sum+d1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北辰2023

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

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

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

打赏作者

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

抵扣说明:

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

余额充值