摘桃子(C语言)

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颗甜美的水蜜桃。
 


样例

输入(1)

2 3
1 5
2 3

输出(1)

8

输入(2)

5 10
3 20
2 20
1 20
4 20
5 20

输出(2)

60

代码

#include<stdio.h>  
#include<stdlib.h>  
   
int main()  
{  
    int n,v,i,j,k,l,temp,temp1,left=0,sum=0,m,m1,m2;  
    scanf("%d %d",&n,&v);   
    int a[10000],b[10000];  
    for(i=0;i<n;i++)    
    {  
        scanf("%d",&a[i]);  
        scanf("%d",&b[i]);  
    }  
      
    for(j=1;j<=n-1;j++)  
     for(i=0;i<n-j;i++)  
      if(a[i]>a[i+1])   
      {  
        temp=a[i];temp1=b[i];  
        a[i]=a[i+1];b[i]=b[i+1];  
        a[i+1]=temp;b[i+1]=temp1;  
      }  
        
    for(k=1;k<=a[n-1]+1;k++)  
    {  
        for(l=0;l<n;l++)  
        {  
            if(a[l]==k||a[l]==k-1) m+=b[l];  
        }  
          
        if(k==1)  
        {  
            if(v>m)   
            {  
                sum+=m;  
                for(l=0;l<n;l++)  
                {  
                    if(a[l]==1) b[l]=0;   
                }  
            }  
              
            else  
            {  
                sum+=v;  
                for(l=0;l<n;l++)  
                {  
                    if(a[l]==1) b[l]-=v;   
                }  
            }  
        }  
          
        else  
        {  
            if(v>m)   
            {  
                sum+=m;  
                for(l=0;l<n;l++)  
                {  
                    if(a[l]==k||a[l]==k-1) b[l]=0;   
                }  
            }  
              
            else  
            {  
                m=v;sum+=v;  
                for(l=0;l<n;l++)  
                {  
                    if(a[l]==k-1&&b[l]-m<0)  
                    {  
                        m-=b[l];b[l]=0;
                    }  
                      
                    else if(a[l]==k-1&&b[l]-m>0)  
                    {  
                        b[l]-=m;break;   
                    }  
                      
                    else if(a[l]==k)  
                    {  
                        b[l]-=m;m=0;   
                    }  
                }  
            }  
        }  
     m=0;  
    }   
    printf("%d\n",sum);  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值