BNU - 26467 - Dragons and Princesses - 优先队列 + 想法

贪心的策略:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=26467

给龙建个优先队列, 按他的价值从小到大。

每遇到一个princess,如果在Q中的个数大于这个princess所需要的龙,就pop。因为肯定不会取已经pop了的龙。 然后输出就行了。

以下是董事的代码:


#include <queue>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
typedef long long LL;
using namespace std;
struct Dragon{
    LL v ;
    int id;
    void input(int _id){
        scanf("%lld" , &v);
        id = _id;
    }
    bool operator < (const Dragon & A) const{
        return v > A.v;
    }
}now;
priority_queue<Dragon, vector<Dragon>, less<Dragon> > Q;
int n ;
string character;
vector<int> ans;
void solve(){
    while(!Q.empty()) Q.pop();
    for (int i = 2 ; i < n ; ++i){
        cin >> character;
        if (character == "d"){
            now.input(i);
            Q.push(now);
        }
        else{
            int x ;
            cin >> x;
            while (Q.size() >= x) Q.pop();
        }
    }
    int x ;
    cin >> character >> x;
    if (Q.size() < x)  cout << "-1" << endl;
    else{
       LL sum = 0 ; ans.clear();
       while (!Q.empty()){
           sum += Q.top().v;
           ans.push_back(Q.top().id);
           Q.pop();
       }
       sort( ans.begin(), ans.end() );
       cout << sum << endl << ans.size() << endl;
       for (int i = 0 ; i < ans.size() ; ++i){
           if (i) cout << " ";
           cout << ans[i];
       }
       cout << endl;
    }
}
int main(){
    while (cin >> n) solve();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值