zoukankan      html  css  js  c++  java
  • 3487. 【NOIP2013模拟联考11】剑与魔法(dragons) (Standard IO)

    Description

    万老师听说某大国很流行穿越,于是他就想写一个关于穿越的剧本。

    闲话休提。话说老师穿越到了某一个剑与魔法的大陆。因为如此这般,所以老师从维娜艾那里得到了预言。老师一共被告知了若干件按顺序结算的事件。这些事件分为两类:战役事件(CASE)、穿越回去事件(END)。战役事件可以选择是否参加,参加了之后会获得一定的金钱。每个END事件发生需要至少参加一定数量的战役事件。特别的是,END事件如果满足要求就会强制发生。老师希望在大陆玩个够,所以他要求只有最后一个END事件会发生。老师希望获得最多的金钱,所以求助于你。  

     

    Input

    第一行一个数N,表示输入文件有多少行。

    接下来每一行用空格隔开一个字符和一个整数。字符为“c”表示战役事件,接下来的整数表示这次涨RP顺带有多少钱;字符为“e”表示穿越回去事件,接下来的整数代表至少要涨多少RP。最后一个事件保证是END事件。  

     

    Output

    第一行一个整数,最多金钱数目。

    若不可能则输出-1。

    Solutions

    很容易看出来的一点是,无视最后的END事件,剔除掉不必要的END事件之后,END 事件的要求是递增的。如此之后,我们从后往前做,用堆维护前面的赏金,随着 END事件要求的减少,尽量从堆里拿出赏金。堆元素的删除用懒惰删除即可。贪 心策略如上,正确性显然。

    代码

     1 #include <iostream>
     2 #include <cmath>
     3 #include <cstdio>
     4 #include <queue>
     5 
     6 using namespace std;
     7 
     8 priority_queue <int> q;
     9 
    10 char s[5];
    11 int n,x;
    12 
    13 int main(){
    14     scanf("%d",&n);
    15     for (int i=1;i<=n;i++){        
    16         scanf("%s",s);
    17         scanf("%d",&x);
    18         if (i==n) break;
    19         if (s[0]=='c'){
    20             q.push(-x);
    21         }
    22         if (s[0]=='e'){
    23             while (q.size()>=x) q.pop();
    24         }
    25     }
    26     int ans=0,num=0;
    27     while (q.size()){
    28         ans-=q.top();
    29         q.pop();
    30         num++;
    31     }
    32     if (num>=x) printf("%d",ans);
    33            else printf("-1");
    34 }
  • 相关阅读:
    Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
    Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
    Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
    Civil 3D 二次开发 新建CLR项目出现错误C2143
    Civil 3D 二次开发 创建AutoCAD对象—— 00 ——
    了解AutoCAD对象层次结构 —— 6 ——块表记录
    datepicker97使用
    使用angular 外接 templateUrl,使用ng-include
    angularJs 遮罩
    网上找的有关css兼容问题
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9431131.html
Copyright © 2011-2022 走看看