zoukankan      html  css  js  c++  java
  • bzoj1029 [JSOI2007]建筑抢修

    Description

      小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏。现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间。同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑。如果某个建筑在一段时间之内没有完全修理完毕,这个建筑就报废了。你的任务是帮小刚合理的制订一个修理顺序,以抢修尽可能多的建筑。

    Input

      第一行是一个整数N接下来N行每行两个整数T1,T2描述一个建筑:修理这个建筑需要T1秒,如果在T2秒之内还没有修理完成,这个建筑就报废了。

    Output

      输出一个整数S,表示最多可以抢修S个建筑.N < 150,000;  T1 < T2 < maxlongint

    Sample Input

    4
    100 200
    200 1300
    1000 1250
    2000 3200

    Sample Output

    3

    正解:贪心,堆优化。

    加入当前建筑时如果已用时间+所需时间<=结束时间,就把这个建筑抢修的时间直接加入堆,并ans++,否则弹出所需时间最大的那个建筑,并更新已用时间。

     1 //It is made by wfj_2048~
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <cstdlib>
     6 #include <cstdio>
     7 #include <vector>
     8 #include <cmath>
     9 #include <queue>
    10 #include <stack>
    11 #include <map>
    12 #include <set>
    13 #define inf (1<<30)
    14 #define fa (now>>1)
    15 #define ls (now<<1)
    16 #define rs (now<<1|1)
    17 #define il inline
    18 #define RG register
    19 #define ll long long
    20  
    21 using namespace std;
    22  
    23 struct node{ ll t1,t2; }a[1000010];
    24  
    25 ll tree[1000010],T,n,len,ans;
    26  
    27 il ll gi(){
    28     RG ll x=0,q=0; RG char ch=getchar();
    29     while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if (ch=='-') q=1,ch=getchar();
    30     while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q ? -x : x;
    31 }
    32  
    33 il ll cmp(const node &a,const node &b){ return a.t2<b.t2; }
    34  
    35 il void Swap(RG ll &a,RG ll &b){ RG ll t=a; a=b,b=t; return; }
    36  
    37 il void Push(RG ll x){
    38     tree[++len]=x; RG ll now=len,nt=fa;
    39     while (nt && tree[now]>tree[nt]) Swap(tree[now],tree[nt]),now=nt,nt=fa; return;
    40 }
    41  
    42 il void Pop(){
    43     RG ll now=1,nt=0; tree[1]=tree[len--];
    44     while (ls<=len){
    45     if (rs>len || tree[ls]>tree[rs]) nt=ls; else nt=rs;
    46     if (tree[now]>tree[nt]) break; Swap(tree[now],tree[nt]),now=nt;
    47     }
    48     return;
    49 }
    50  
    51 il void work(){
    52     n=gi(); for (RG ll i=1;i<=n;++i) a[i].t1=gi(),a[i].t2=gi(); sort(a+1,a+n+1,cmp);
    53     for (RG ll i=1;i<=n;++i)
    54     if (T+a[i].t1<=a[i].t2) ans++,T+=a[i].t1,Push(a[i].t1);
    55     else if (tree[1]>a[i].t1) T+=a[i].t1-tree[1],Pop(),Push(a[i].t1);
    56     printf("%lld",ans); return;
    57 }
    58  
    59 int main(){
    60     work();
    61     return 0;
    62 }
  • 相关阅读:
    POJ 2528 Mayor's posters(线段树+离散化)
    POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
    HDU 1698 Just a Hook(线段树 区间替换)
    HDU 2795 Billboard(区间求最大值的位置update的操作在query里做了)
    JQuery中ajax使用方法
    JavaSe中JFrame和Frame的区别
    解决 Eclipse 项目有红感叹号的方法
    BaseServlet原理
    验证码的实现
    BaseServlet使用方法
  • 原文地址:https://www.cnblogs.com/wfj2048/p/6416571.html
Copyright © 2011-2022 走看看