HDU 4546 比赛难度(优先队列)

HDU 4546 比赛难度

题目链接

思路:由于m不是很大,如果用一个优先队列维护,如果每次能保证加入的值是最小的,那么只需要加入m次就能完成了,时间复杂度足够,那么如何保证呢,就把数列排序,维护优先队列为当前和加下一个位置和的最小值,每次一个出队,把下一个位置取于不取在入队,最后求出答案即可

代码:

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;

const int N = 10005;

int t, n, m, a[N];

struct Node {
	int sum, nextsum, nextid;
	Node() {}
	Node(int sum, int nextsum, int nextid) {
		this->sum = sum;
		this->nextsum = nextsum;
		this->nextid = nextid;
	}
	bool operator < (const Node &c) const {
		return nextsum > c.nextsum;
	}
};

const int INF = 0x3f3f3f3f;

int main() {
	int cas = 0;
	scanf("%d", &t);
	while (t--) {
		scanf("%d%d", &n, &m);
		for (int i = 0; i < n; i++) scanf("%d", &a[i]);
		sort(a, a + n);
		priority_queue<Node> Q;
		Q.push(Node(0, a[0], 0));
		int cnt = 0;
		while (!Q.empty()) {
			Node u = Q.top();
			Q.pop();
			if (u.nextid >= n) continue;
			Q.push(Node(u.sum, u.sum + a[u.nextid + 1], u.nextid + 1));
			Q.push(Node(u.nextsum, u.nextsum + a[u.nextid + 1], u.nextid + 1));
			cnt++;
			if (cnt == m) {
				printf("Case #%d: %d\n", ++cas, u.nextsum);
				break;
			}
		}
	}
	return 0;
}
时间: 2024-10-11 02:22:08

HDU 4546 比赛难度(优先队列)的相关文章

HDU ACM 4546 比赛难度-&gt;优先队列

分析:使用优先队列. 以next为优先级,小的先出队 读入数据后排序,初始化队列第一个元素(0,a[0],0) 每次出队一个元素,入队(sum,sum+a[nextid+1],nextid+1),(next,next+a[nextid+1],nextid+1),即是否加上a[nextid+1]都考虑进去了. 这样每次新加入的元素都是下一个最小的(next),进行m次就得到了第m小. #include<iostream> #include<queue> #include<alg

hdu 4546 比赛难度

优先队列,也是看了别人的代码才有的思路 #include<iostream> #include<algorithm> #include<queue> #define maxn 100000+5 using namespace std; struct stu { int sum,id; friend bool operator<(stu x,stu y) { return x.sum>y.sum; } }; priority_queue<stu>m

[ACM] hdu 1242 Rescue (BFS+优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is:

HDU 1242——Rescue(优先队列)

题意: 一个天使a被关在迷宫里,她的许多小伙伴r打算去救她,求小伙伴就到她需要的最小时间.在迷宫里有守卫,打败守卫需要一个单位时间,如果碰到守卫必须要杀死他 思路: 天使只有一个,她的小伙伴有很多,所以可以让天使找她的小伙伴,一旦找到小伙伴就renturn.时间小的优先级高.优先队列搞定 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<

hdu 2850 Load Balancing (优先队列 + 贪心)

题目大意: 怎么分配n个任务到m个服务器上使得负载尽量平衡. 思路: 将任务从大到小排序,依次放入负载最小的那个服务器中. 因为是spj 的缘故,所以可以使用这个贪心. 比如数据 6 2 7 5 3 3 3 3 就会得到错误答案. #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespac

HDU 4857 拓扑排序 优先队列

n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得到的序列就是从大到小的,最后倒序输出就行了. 写这题的时候头好痛阿肚子好痛阿,再也不想熬夜了,一点效率都没有. /** @Date : 2017-09-29 19:29:12 * @FileName: HDU 4857 拓扑排序 + 优先队列.cpp * @Platform: Windows * @

HDU 4857 逃生 (优先队列+反向拓扑)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 解题报告:有n个点,有m个条件限制,限制是像这样的,输入a  b,表示a必须排在b的前面,如果不能确定两个数谁排在前面则尽量把小的排在前面. 首先把出度为0的点加入到优先队列中,然后每次用优先队列中弹出的点去更新其它点的出度,更新的同时如果又有其它点的出度为0的话又加到优先队列中, 最后按照从优先队列中出队的反序输出就可以了.我还是不懂为什么按照入度为0然后加入到优先队列然后正序输出这样为什么

HDU 4546 优先队列

用优先队列BFS一遍即可, 每个节点分别记录 当前难度,加上下一个以后的难度,和下一个为哪道题 队列优先弹出加上下一个以后难度最小的 #include "stdio.h" #include "string.h" #include "algorithm" #include "queue" using namespace std; struct node { int now,next,id; bool friend operato

hdu 1242 Rescue(bfs+优先队列)

Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is: approach Angel. We assume