其他分享
首页 > 其他分享> > CF-SGU-P548-Dragons and Princesses

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