2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > (程序设计方法与实践)摘桃子

(程序设计方法与实践)摘桃子

时间:2024-01-07 12:02:16

相关推荐

(程序设计方法与实践)摘桃子

摘桃子

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

代码如下:

#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]) //按照从小到大给a数组的成熟天数排序 {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); }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。