BZOJ1029

来源:互联网 发布:csp绘画软件百度云 编辑:程序博客网 时间:2024/06/02 23:10

传送门:BZOJ1029

还记得线段覆盖吗?

我们将建筑物按Deadline排序,然后扫描排序后数组,如果当前建筑物可以被修建,则修建,否则,如果当前建筑物所用时间小于修过的建筑物最大时间,则放弃最大时间,改修它。
这个算法的正确性是显然的。
代码上的小细节见下:

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <algorithm>#include <iostream>#include <queue>using namespace std;struct Node{    int Needtime;    int Deadline;    bool operator <(const Node& a)const{        return Deadline<a.Deadline;    }};Node da[150005];int n;priority_queue<int> Q;void Readdata(){    freopen("loli.in","r",stdin);    scanf("%d",&n);    for(int i=1;i<=n;i++)        scanf("%d%d",&da[i].Needtime,&da[i].Deadline);}void Solve(){    sort(da+1,da+1+n);    int used=0;Q.push(0);    for(int i=1;i<=n;i++)        if(used+da[i].Needtime<=da[i].Deadline){            Q.push(da[i].Needtime);            used+=da[i].Needtime;        }        else            if(da[i].Needtime<Q.top()){                used+=(da[i].Needtime-Q.top());                Q.pop();                Q.push(da[i].Needtime);            }    printf("%d",Q.size()-1);}void Close(){    fclose(stdin);    fclose(stdout);}int main(){    Readdata();    Solve();    Close();    return 0;}
1 1
原创粉丝点击