博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU4546 比赛难度
阅读量:6167 次
发布时间:2019-06-21

本文共 1335 字,大约阅读时间需要 4 分钟。

设置优先级队列

{

sum:当前和

nex:加入下个元素的和

ith:将要考虑的下个元素

}
以nex为优先级,小的先出队

读入数据后排序,初始化队列第一个元素(0,a[0],0)

每次出队一个元素,入队(sum,sum+a[ith],ith+1),(nex,nex+a[ith],ith+1),即是否加上a[ith]都考虑进去了。

这样每次新加入的元素都是下一个最小的(nex),进行m次就得到了第m小。

#include
#include
#include
#include
#include
using namespace std;int n, m;const int maxn = 10011;struct Node{ int sum; int nex; int ith; Node(){} Node(int sum_, int nex_, int ith_){sum = sum_, nex = nex_, ith = ith_;} bool operator<(const Node &b)const {
return b.nex < nex;}};int a[maxn];int Cal(int m){ priority_queue
q; Node lin; lin.sum = 0, lin.nex = a[0], lin.ith = 0; q.push(lin); int cnt = 0; a[n] = 0; while(cnt < m) { lin = q.top(); q.pop(); if(lin.ith >= n) continue; q.push(Node(lin.sum, lin.sum + a[lin.ith + 1], lin.ith + 1)); q.push(Node(lin.nex, lin.nex + a[lin.ith + 1], lin.ith + 1)); cnt += 1; } for(m = 0; !q.empty(); m ++) a[m] = q.top().sum, q.pop(); sort(a, a + m); return a[m - 1];}int main(){ int i, t, ca; for(scanf("%d", &t), ca = 1; ca <= t; ca ++) { scanf("%d%d", &n, &m); for(i = 0; i < n; i ++) scanf("%d", &a[i]); sort(a, a + n); printf("Case #%d: %d\n", ca, Cal(m)); } return 0;}

 

转载于:https://www.cnblogs.com/CSGrandeur/archive/2013/05/17/3084741.html

你可能感兴趣的文章
TypeScript基础学习
查看>>
读安晓辉老师的访谈有感
查看>>
jQuery 的选择器
查看>>
书籍列表
查看>>
scrollview 例子2
查看>>
20165211 2017-2018-2 《Java程序设计》课程总结
查看>>
C# 截取字符串某个字符分割的最后一部分
查看>>
css2选择器
查看>>
Selenium Chrome浏览器的启动以及proxy设置
查看>>
uCOS-II+LwIP+DM9000(源代码)
查看>>
BZOJ3172:[TJOI2013]单词——题解
查看>>
洛谷4643:【模板】动态dp——题解
查看>>
python三大神器之virtualenv pip, virtualenv, fabric通称为pythoner的三大神器。
查看>>
MPMoviePlayerController播放视频
查看>>
java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)
查看>>
[转] Transformer
查看>>
回溯法--装载问题
查看>>
HTML中的GroupBox
查看>>
Python入门-----Windows安装
查看>>
【java】TreeMap/HashMap的循环迭代中 keySet和entrySet和forEach方式 + map的几种迭代方式...
查看>>