SGU 548 Dragons and Princesses

题意:

n个格子  每个格子有龙或者公主  勇士从1走到n  路过龙可以杀死可以不杀  杀死有钱拿  路过公主  如果之前杀龙的数量满足公主要求就会停止行走  问  勇士想多拿钱  但是必须要满足n格子的公主  最多拿多少钱

思路:

公主只限制杀龙的数量  因此不想停下来结婚就控制杀龙的数量即可  如果要放弃一些龙  那么一定会贪心放弃钱少的龙  最后判断一下能不能和n格子的公主结婚即可

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
#define N 200010

int n;
struct dragon {
	int x, id;
	bool operator<(const dragon ff) const {
		return x > ff.x;
	}
} now;
priority_queue<dragon> q;
int ans[N], tot, sum;

int main() {
	int i, k, s;
	char who[100];
	while (!q.empty())
		q.pop();
	scanf("%d", &n);
	for (i = 2; i <= n; i++) {
		scanf("%s%d", who, &k);
		if (i == n)
			break;
		if (who[0] == 'd') {
			now.x = k;
			now.id = i;
			q.push(now);
		} else {
			s = q.size();
			if (s >= k) {
				k = s - k + 1;
				while (k--)
					q.pop();
			}
		}
	}
	s = q.size();
	if (s < k)
		printf("-1\n");
	else {
		tot = sum = 0;
		while (!q.empty()) {
			now = q.top();
			q.pop();
			sum += now.x;
			ans[tot++] = now.id;
		}
		printf("%d\n", sum);
		printf("%d\n", tot);
		sort(ans, ans + tot);
		for (i = 0; i < tot; i++)
			printf("%d%s", ans[i], (i == tot - 1) ? "\n" : " ");
	}
	return 0;
}
时间: 2024-10-07 14:37:42

SGU 548 Dragons and Princesses的相关文章

codeforce447 D SGU 548 贪心+优先队列

codeforce447 D - DZY Loves Modification 题意:有一个n*m的矩阵,每次可以选择一行或者一列,可以得到这行或这列的所有元素sum的积分,然后使这一列/行的每一个元素都减少p,接着再选择一行或一列,共操作k次,n,m<=1000,k<=1000000求最多能得到多少积分 思路:每次选择sum最大的行或者列,但是时间复杂度太大,过不去~若选择一行,则每个列的sum一定减少p,同理:若选择的行数和列数确定下来了,选择i行,k-i列,那么行和列之间谁选选择就没有影

NEERC Southern Subregional 2012

NEERC Southern Subregional 2012 Problem B. Chess Championship 题目描述:有两个序列\(a, b\),两个序列都有\(n\)个数,并且这\(2n\)个数两两不同,现在要将这两个序列里的数两两配对,组成\(n\)个数对,要求数对中\(a\)的数比\(b\)的数大的数对个数要比其它的多\(m\)个.问方案数. solution 将这\(2n\)个数从小到大排,预处理出前\(i\)个数中\(a, b\)的个数\(suma, sumb\), \

【SGU 390】Tickets (数位DP)

Tickets Description Conductor is quite a boring profession, as all you have to do is just to sell tickets to the passengers. So no wonder that once upon a time in a faraway galaxy one conductor decided to diversify this occupation. Now this conductor

ACM: SGU 101 Domino- 欧拉回路-并查集

sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Description Dominoes – game played with small, rectangular blocks of wood or other material, each identified by a number of dots, or pips, on its face. The bl

[2016-02-08][UVA][548][Tree]

UVA - 548 Tree Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root

SGU 116 Index of super-prime 数论+完全背包+输出方案

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=116 题意好晦涩 给你一个不超过一万的数 问它最少可以用多少个“超级素数”来表示 使“超级素数”之和等于它 如果无法这样表示 输出0 否则 按非降序形式输出方案 数论部分就模板的问题 没什么说的 完全背包方面也很常规 说说[输出方案] 背包九讲的伪码给的是二维dp[]的方法 实际上稍加改动就可以用在一维数组上 用一个rec[]记录dp[]的当前状态是从哪个状态转移而来(即上一个状态) 通过

SGU 乱搞日志

SGU 100 A+B :太神不会 SGU 101 Domino: 题目大意:有N张骨牌,两张骨牌有两面有0到6的数字,能相连当且仅当前后数字相同,问能否有将N张骨牌连接的方案?思路:裸的欧拉回路,注意自环,连通 1 //sgu101 2 #include<iostream> 3 #include<cstdio> 4 #include <math.h> 5 #include<algorithm> 6 #include<string.h> 7 #i

SGU 275 To xor or not to xor (高斯消元)

题目地址:SGU 275 首先,贪心的思想,每一二进制位上要尽量是1,而能不能是1用高斯消元来解决.当该位有一个可以使之为1的变元时,就说明这位可以为1,而且令该变元控制该位,然后向低位消元. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h>

SGU 221.Big Bishops(DP)

题意: 给一个n*n(n<=50)的棋盘,放上k个主教(斜走),求能放置的种类总数. Solution : 同SGU 220,加个高精度就好了. code #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; string f[2][250][250], ans;