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>mapp;
int n,m;
int rem[maxn];
stu x,y;
int main()
{
	int Case=1,t;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		fill(rem,rem+maxn,100000);//很重要
		for(int i=0;i<n;i++) cin>>rem[i];
		sort(rem,rem+n);
		while(mapp.size()) mapp.pop();
		cout<<"Case #"<<Case++<<": ";
		int d=0;
		x.sum=rem[0];
		x.id=0;
		mapp.push(x);
		while(mapp.size())
		{
			x=mapp.top();
			mapp.pop();
			d++;
			if(d==m){cout<<x.sum<<endl;break;}
			y.sum=x.sum+rem[x.id+1];
			//cout<<y.sum<<" "<<y.id<<endl;
			y.id=x.id+1;
			mapp.push(y);
			y.sum=x.sum-rem[x.id]+rem[x.id+1];
			y.id=x.id+1;
			mapp.push(y);
		}
	}
	return 0;
}
时间: 2024-11-02 09:17:37

hdu 4546 比赛难度的相关文章

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

HDU 4546 比赛难度 题目链接 思路:由于m不是很大,如果用一个优先队列维护,如果每次能保证加入的值是最小的,那么只需要加入m次就能完成了,时间复杂度足够,那么如何保证呢,就把数列排序,维护优先队列为当前和加下一个位置和的最小值,每次一个出队,把下一个位置取于不取在入队,最后求出答案即可 代码: #include <cstdio> #include <cstring> #include <queue> #include <algorithm> usin

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 确定比赛名次(拓扑排序)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17811    Accepted Submission(s): 7126 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3

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 1285 比赛排名 【拓扑排序】

拓扑排序模版题 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int maxe=250000+10; const int maxh=500+10; typedef struct Edge { int to,next; }; Edge E[maxe]; int

HDU 5269 &amp;&amp; BestCoder #44 1002 ZYB loves Xor I (分治)

题目地址:HDU 5269 比赛的时候想到了分治的思路,但是脑残了.,.写麻烦了...调了好久也没调出来..(分治写的太少..)赛后优化了一下..就过了.. 我的思路是先排序,排序是按照的将每个数字的二进制表示倒过来的字典序从大到小排,比如样例2中的2,6,5,4,0,二进制分别是010,110,101,100,000,排序之后是 101 110 010 100 000 这样的话就把后缀相同的都给放在一块了.其实也相当于字典树,不过比赛的时候没想到字典树,只想到了分治.. 然后从末位开始找,对所

HDU 5011 Game(博弈论)

题目地址:HDU 5011 比赛的时候看那么多人过直接傻眼了..无奈,这题是真不会做,博弈论一点不会,得好好补补了.没想到这题的代码竟然是这样..当时想了好多水的方法乱蒙也没水过去.. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #includ

华为比赛总结303-426

自从本科参加了数学建模比赛之后,我觉得我研究生阶段应该不会再参加任何比赛,就想平平淡淡的读完研究生,踏踏实实的找个工作就行了,很早就听说了华为的软件精英挑战赛,但是并没有什么参加的欲望,但到了正式比赛的那天,心里还是非常激动的去找队友想比赛,有赛必争这句话已经深深影响了我,不喜欢太平庸的生活,毕竟华为的比赛如果进入36强就可以发面试绿卡和高薪offer,研一能找个offer还是很有吸引力的,就是这么直接的目的报名参加了比赛. 今年的比赛难度是这几年中最大的,出题目后赶紧找了几个队友(都是泪),选

hdu 5459(递推好题)

Jesus Is Here Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 512    Accepted Submission(s): 368 Problem Description I've sent Fang Fang around 201314 text messages in almost 5 years. Why can't