CF-SGU-P548-Dragons and Princesses
作者:互联网
算法:优先队列
分析:
1、骑士在除了最后一个公主杀龙数可以不限,在其余公主前的杀龙总数必须小于她的美丽值。
2、假设我们已经求得公主 i - 1 的最优方案S,公主 i 的美丽值为 k ,在 i - 1 ~ i 之间又加入了 S1 ,那么公主 i 的最优方案就是 集合 S 与 S1 从大到小 前 k 条龙。可以用优先队列来维护。
3、如果到最后只剩下 t 条龙小于最后公主的美丽值就输出 -1。
代码:
#include<bits/stdc++.h>
using namespace std;
struct d{
int val, id;
bool operator <(const d p) const {
return val > p.val;
}
}now;
const int N = 200005;
int n, i, k, s, ans, tot;
char ch;
bool f[N];
priority_queue<d> q;
int main(){
scanf("%d", &n);
for(i = 2; i <= n; i++){
scanf(" %c%d", &ch, &k);
if(i == n)
continue;
if(ch == 'd'){
now.id = i; now.val = k;
q.push(now);
}
else{
s = q.size();
if(s >= k){
k = s - k + 1;
while(k--) q.pop();
}
}
}
s = q.size();
if(s < k){
cout<<-1; return 0;
}
while(!q.empty()){
now = q.top(); q.pop();
f[now.id] = true; tot += now.val; ans++;
}
cout<<tot<<endl<<ans<<endl;
for(i = 2; i < n; i++)
if(f[i]) cout<<i<<" ";
}
标签:val,int,S1,SGU,CF,Dragons,bool,条龙,公主 来源: https://blog.csdn.net/weixin_44618487/article/details/98501266