BZOJ 1029 [JSOI2007]建筑抢修

Posted Achen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1029 [JSOI2007]建筑抢修相关的知识,希望对你有一定的参考价值。

传送门

贪心。

感觉最近脑子不太好用,不知道是不是线段树树剖和网络流把脑子写傻了。

一开始瞎那啥乱贪心

//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<ctime>
typedef long long LL;
using namespace std;
const int maxn=150000+299;
struct node{
    int t1,t2;
    friend bool operator <(const node &A,const node &B) {
        return A.t2<B.t2||(A.t2==B.t2&&A.t1<B.t1);
    }
}p[maxn];
int ans,n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) 
        scanf("%d%d",&p[i].t1,&p[i].t2);
    sort(p+1,p+n+1);
    int now=0;
    for(int i=1;i<=n;) {
        int j=i+1,flag=0;
        if(now+p[i].t1>p[i].t2) {i++; continue;}
        while(j<=n&&now+p[i].t1+p[j].t1>p[j].t2) {
            if(p[j].t1<p[i].t1) { i=j; flag=1; break; }
            j++;    
        }
        if(flag) continue;
        now+=p[i].t1;
        ans++;
        i=j;
    }
    printf("%d\\n",ans);
    return 0;
}
View Code

WA了,×掉它的数据

16
7 13
8 17
8 8
9 8
4 3
5 19
10 16
10 8
3 13
2 8
7 11
7 15
6 19
1 5
9 1
1 12

正解

不知道为何sxy大佬用set当堆,习惯用优先队列。

//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<ctime>
typedef long long LL;
using namespace std;
const int maxn=150000+299;
struct node{
    int t1,t2;
    friend bool operator <(const node &A,const node &B) {
        return A.t1<B.t1;
    }
}p[maxn];
int ans,n;
bool cmp(const node &a,const node &b) {
    return a.t2<b.t2;
}
priority_queue<node>que;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) 
        scanf("%d%d",&p[i].t1,&p[i].t2);
    sort(p+1,p+n+1,cmp);
    int now=0;
    for(int i=1;i<=n;i++) {
        if(now+p[i].t1<=p[i].t2) {
            ans++;
            now+=p[i].t1;
            que.push(p[i]); 
        }
        else {
            if(!que.empty()) {
                node tp=que.top();
                if(tp.t1>p[i].t1&&now-tp.t1+p[i].t1<=p[i].t2) {
                    que.pop();
                    now=now-tp.t1+p[i].t1;
                    que.push(p[i]); 
                }
            }
        }
    }
    printf("%d\\n",ans);
    return 0;
}
View Code

 

以上是关于BZOJ 1029 [JSOI2007]建筑抢修的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ-1029: [JSOI2007]建筑抢修(贪心+堆优化)

BZOJ1029: [JSOI2007]建筑抢修(贪心)

BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]

BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

bzoj 1029 [JSOI2007]建筑抢修 - 贪心 + 大根堆

BZOJ 1029: [JSOI2007]建筑抢修优先队列+贪心策略