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

来源:互联网 发布:php框架排行 编辑:程序博客网 时间:2024/05/17 10:25

题目链接:http://codeforces.com/contest/441/problem/B

题目大意:有一个果园里有很多树,上面有很多果实,为了不然成熟的果实腐烂,必须在两天之内收集起来。给出果园有的树,以及该树上的果实个数,工人每天可以采集的上限,求出这段时间之后,能收集到的最大值

很简单,维护一个一维数组ans[],首先将数据存在结构体中,再按果实成熟的日期ai升序排序,优先将果实计入ans[ai]中,多的放入ans[ai+1]里面,如果大于上限,则记为上限大小,最后这个数组全部元素的和就是答案了。

#include <iostream>#include <cstdio>#include <algorithm>#define MAX_N 3000using 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;}


0 0
原创粉丝点击