2.摘桃子

目录

题目

问题描述

输入

输出

注意事项

思路

小坑


题目

问题描述

丹枫花园的果树成熟啦!

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

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

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

输入

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

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

输出

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

提示

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

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

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

注意事项

思路

用数组存储每天的成熟个数即可。

是不是在同一棵树上的没有必要区分,只需注意本天与前一天的桃子个数。

注意

桃树成熟天数并不是连续的,可能存在有些天数没有桃树成熟的情况

例:

3 5

1 3

2 9

4 3

代码

#include<stdio.h>
#include<string.h>
int main()
{
	int num = 0; int lon = 0; 
	int get = 0; int day = 0;
	int arr[100000] = {0};
	scanf("%d",&num); 
	scanf("%d",&lon);
	for(int i = 0; i < num; i++)//存进去 
	{
		int j = 0; int t = 0;
		scanf("%d",&j);
		scanf("%d",&t);
		if(arr[j-1] == 0)//找到最久成熟的天数
		{
			if(j > day) 
			day = j; 
		}
		arr[j-1] = arr[j-1]+t;
	}
	int i = 0;//第一天特殊处理
	if(i == 0)
	{
		if(arr[0] >= lon)
		{
			get += lon; 
			arr[0] = arr[0] - lon;
		}
		else if(arr[0] < lon)
		{
			get += arr[0]; 
			arr[0] = 0;
		}
	}
	for(i = 1; i < day; i++)//之后摘桃子 
	{
		int t = lon;
		if(arr[i-1] >= t)//前一天都摘不完
		{
			get += t;	
		}
		else if(arr[i-1] < t)//前一天全摘完,且还可以摘今天的
		{
			get += arr[i-1]; 
			t = t-arr[i-1];
			if(arr[i] >= t)
			{
				get += t; 
				arr[i]=arr[i] - t;
			}
			else if(arr[i] < t)
			{
				get += arr[i]; 
				arr[i]=0;
			}
		}
	}
	if(i == day)//最后一天 
	{
		if(arr[i-1] <= lon) 
			get += arr[i-1];
		else if(arr[i-1] > lon) 
			get += lon;
	}
	printf("%d\n",get);
	return 0;
 } 

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值