码迷,mamicode.com
首页 > 其他好文 > 详细

朝鲜战争:轰炸大小和岛

时间:2015-08-11 09:58:05      阅读:591      评论:0      收藏:0      [点我收藏+]

标签:

 

试题描述

技术分享

   1951年11月,抗美援朝,保家卫国的志愿军为了抵挡美军疯狂的进攻,决定轰炸大小和岛。支援军训练有素命中率达到90%!美军大小和岛上的设施被损毁。现在由于大多数美军都去还击志愿军了,只剩下一个修理工了,这个修理工虽然开着汽车,能够瞬时到达,但修理还是需要时间的,如果不及时维修,装备就会报废。且装备只能一个个维修。请问按怎样的修理顺序才能保住更多的装备?

输入
第一行:是一个整数N
接下来N行:每行两个整数T1,T2
修理这个建筑需要T1分钟,如果在T2分钟之内还没有
修理完成,这个建筑就报废了。
输出
输出一个整数S,表示最多可以抢修S个建筑。 
输入示例
4
100 200
200 1300
1000 1250
2000 3200
输出示例
3
其他说明
数据范围: N<15000

C程序:

#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N=150006;

struct Big_Heap {
    int A[N<<1|1], tot;

    void init(int n) {
        for(int i=1; i<=(n<<1|1); i++) A[i]=0;
        tot=0;
    }

    void Insert(int val) {
        A[++tot]=val;
        for(int x=tot; x>1 && A[x]>A[x>>1]; x>>=1) swap(A[x], A[x>>1]);
    }

    void Update(int val) {
        A[1]=val;
        for(int i=1, j=2; j<=tot; i=j, j<<=1) {
            if((j|1)<=tot && A[j]<A[j|1]) j|=1;
            if(A[j]<A[i]) break;
            swap(A[i], A[j]);
        }
    }
} heap;

struct data {
    int t1, t2;
    bool operator < (const data &T) const {
        return t2<T.t2;
    }
} A[N];
int n, ans, cur;

int main() {
    while(scanf("%d", &n)!=EOF) {
        for(int i=0; i<n; i++) scanf("%d%d", &A[i].t1, &A[i].t2);
        sort(A, A+n);
        cur=ans=0, heap.init(n);
        for(int i=0; i<n; i++) {
            if(A[i].t1+cur<=A[i].t2) ans++, heap.Insert(A[i].t1), cur+=A[i].t1;
            else {
                if(!heap.tot) continue;
                int val=heap.A[1];
                if(val<=A[i].t1) continue;
                cur-=val-A[i].t1;
                heap.Update(A[i].t1);
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

朝鲜战争:轰炸大小和岛

标签:

原文地址:http://www.cnblogs.com/WHYFRANK/p/4720054.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!