hdu5884】的更多相关文章

题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给定的情况下,构造k叉哈夫曼树.O(nlogn)的做法:先对所有数排序,另外一个队列维护合并后的值,取值时从两个序列前端取小的即可. 注:如果(n-1)%(k-1)!=0,那么就要增加(k-1-(n-1)%(k-1))个权值为0的叶子节点作虚拟点. #include<cstdio> #include…
hdu5884 题意 给出 n 个数,每次选择不超过 k 个数合并(删掉这些数,加入这些数的和),花费为合并的这些数的和,要求最后只剩下一个数,问 k 最小取多少. 分析 二分 k,合并数的时候可以按照哈夫曼树构树的原理来进行合并.因为新形成的数存在递增的单调性,所以可以开一个数组(队列)存储新生成的数,将原来的数组排序,通过取两个数组最小的 k 个数,将和放置到队尾,直到只剩下一个数. 如果 \((n-1)\%(k-1)\neq0\),说明不能正好合并得到一个数,此时要先选择\((n-1)\%…
HDU5884 Sort 题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k. 思路:还是太单纯,看完题目一直以为要用归并排序来解题,如果已经看过多叉哈夫曼树的知识的话估计就不会这样了.先二分查找这个k,然后用多叉哈夫曼树来判断这个k是不是还能再变小.用两个队列来实现多叉哈夫曼树. PS:如果不进行提前处理的话,最后一次的归并可能就凑不齐k个来了,所以需要提前处理一下. 代码: #include <iost…
//--------------------------------------------------------------- /*---贪心策略+二分+队列 -----将原数组排序,然后每次取k个较小的数合并,将合并的结果保存在一个队列中,继续取出k个数(队列和数组中)... -----但是会出现一个问题当(n-1)%(k-1)!=0时,这样最后剩下的数个数小于k,这会导致序列非严格递减.于是可以先将 -----前(n-1)%(k-1)+1个数合并结果放入队列中,剩下的恰好可以每次合并k个…
#include <cstdio> #include <queue> #include <algorithm> #include <string.h> //#include <bits/stdc++.h> using namespace std; ; int t; ]; ]; int n,m; bool judge(int mid){ priority_queue<int,vector<int>,greater<int&g…
Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 547    Accepted Submission(s): 101 Problem Description Recently, Bob has just learnt a naive sorting algorithm: merge sort. Now, Bob receives a t…
Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1038    Accepted Submission(s): 231 Problem Description Recently, Bob has just learnt a naive sorting algorithm: merge sort. Now, Bob receive…