zoukankan      html  css  js  c++  java
  • bzoj 1029: [JSOI2007]建筑抢修【贪心+堆】

    第一想法是按照结束时间贪心,但是这样有反例
    所以先按照t贪心,能选则选,把选的楼的持续时间放进大根堆里,当当前的楼不能选的时候如果当前的持续时间比大根堆里最大的要小,就用这个替换最大,这样总数不变但是时间缩短了

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    using namespace std;
    const int N=150005;
    int n,ans;
    struct qwe
    {
    	long long l,t;
    }a[N];
    bool cmp(const qwe &a,const qwe &b)
    {
    	return a.t<b.t;
    }
    long long read()
    {
    	long long r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;i++)
    		a[i].l=read(),a[i].t=read();
    	sort(a+1,a+1+n,cmp);
    	long long tm=0;
    	priority_queue<long long>q;
    	for(int i=1;i<=n;i++)
    	{
    		if(tm+a[i].l<=a[i].t)
    		{
    			tm+=a[i].l;
    			q.push(a[i].l);
    			ans++;
    		}
    		else if(!q.empty()&&a[i].l<q.top())
    		{
    			tm=tm-q.top()+a[i].l;
    			q.pop();
    			q.push(a[i].l);
    		}
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Beta版使用说明
    【每日scrum】NO.7
    【每日scrum】NO.6
    【每日scrum】NO.5
    【每日scrum】NO.4
    【每日scrum】NO.3
    【每日scrum】NO.2
    【每日scrum】NO.1
    运行及总结
    测试与调试
  • 原文地址:https://www.cnblogs.com/lokiii/p/9409016.html
Copyright © 2011-2022 走看看