题目链接:http://codeforces.com/contest/441/problem/B
题目大意:有一个果园里有很多树,上面有很多果实,为了不然成熟的果实腐烂,必须在两天之内收集起来。给出果园有的树,以及该树上的果实个数,工人每天可以采集的上限,求出这段时间之后,能收集到的最大值
很简单,维护一个一维数组ans[],首先将数据存在结构体中,再按果实成熟的日期ai升序排序,优先将果实计入ans[ai]中,多的放入ans[ai+1]里面,如果大于上限,则记为上限大小,最后这个数组全部元素的和就是答案了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAX_N 3000
using namespace std;
struct fruit
{
int x,y;
};
bool cmp(fruit a,fruit b)
{
return a.x<b.x;
}
fruit a[MAX_N+1];
int ans[MAX_N+1];
int main()
{
int n,v,maxi=0;
scanf("%d%d",&n,&v);
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
maxi=max(maxi,a[i].x);
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
if(ans[a[i].x-1]+a[i].y<=v)
{
ans[a[i].x-1]+=a[i].y;
}
else
{
if(ans[a[i].x-1]+ans[a[i].x]+a[i].y-v>v)
ans[a[i].x]=v;
else
ans[a[i].x]+=ans[a[i].x-1]+a[i].y-v;
ans[a[i].x-1]=v;
}
}
int Mans=0;
for(int i=0;i<=maxi;i++)
Mans+=ans[i];
printf("%d\n",Mans);
return 0;
}