首页 > 其他 > 详细

BZOJ 1555 KD之死

时间:2016-09-05 16:46:50      阅读:124      评论:0      收藏:0      [点我收藏+]

贪心,按t+w排序维护不一定放到拖车上的大根堆。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 600500
using namespace std;
struct GC
{
    int w,t,flag;
}p[maxn];
int n,m,maxv,cnt=0,sum=0,x;
priority_queue <int> q;
bool cmp(GC x,GC y)
{
    return x.w+x.t<y.w+y.t;
}
int main()
{
    scanf("%d%d%d",&n,&m,&maxv);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&p[i].w,&p[i].t);
        p[i].flag=0;
    }
    for (int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        p[x].flag=1;
    }
    p[n+1].w=0;p[n+1].t=maxv;p[n+1].flag=1;
    sort(p+1,p+n+1,cmp);
    for (int i=1;i<=n+1;i++)
    {
        if (p[i].flag)
        {
            while ((sum>p[i].t) && (q.size()))
            {
                sum-=q.top();
                cnt--;q.pop();
            }
            if (!q.size() || (sum>p[i].t))
            {
                printf("Foolish SD!");
                return 0;
            }
            sum+=p[i].w;cnt++;
        }
        else
        {
            if (p[i].t>=sum)
            {
                sum+=p[i].w;cnt++;
                q.push(p[i].w);
            }
            else
            {
                if (q.size() && p[i].t>=sum-q.top() && q.top()>p[i].w)
                {
                    sum-=q.top();sum+=p[i].w;
                    q.pop();q.push(p[i].w);
                }
            }
        }
    }
    printf("%d\n",cnt-1);
    return 0;
}

 

BZOJ 1555 KD之死

原文:http://www.cnblogs.com/ziliuziliu/p/5842671.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!