Codeforces (441B) Round #252 (Div. 2) B题

题目链接: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;
}


你可能感兴趣的:(C++,ACM,codeforces)