1. #include <cstdio>
  2.  
  3. #include <queue>
  4.  
  5. #include <algorithm>
  6.  
  7. #include <string.h>
  8. //#include <bits/stdc++.h>
  9.  
  10. using namespace std;
  11.  
  12. const int maxn=;
  13.  
  14. int t;
  15.  
  16. int a[maxn+];
  17.  
  18. int sum[maxn+];
  19.  
  20. int n,m;
  21.  
  22. bool judge(int mid){
  23. priority_queue<int,vector<int>,greater<int> > q;
  24. int cnt=;
  25. int s=(n-)%(mid-);
  26. if(s){
  27. s++;
  28. int temp=sum[(n-)%(mid-)+];
  29. q.push(temp);
  30. cnt+=temp;
  31. }
  32. for(int i=s+;i<=n;i++){
  33. q.push(a[i]);
  34. }
  35. while(q.size()!=){
  36. int temp=;
  37. for(int i=;i<=mid;i++){
  38. if(!q.empty()){
  39. temp+=q.top();
  40. q.pop();
  41. } else {
  42. break;
  43. }
  44. }
  45. q.push(temp);
  46. cnt+=temp;
  47. }
  48. return cnt<=m;
  49. }
  50.  
  51. int solve(){
  52. int lb=,ub=n;
  53. while(ub-lb>){
  54. int mid=(ub+lb)>>;
  55. if(judge(mid)) ub=mid;
  56. else lb=mid;
  57. }
  58. if(judge(lb)){
  59. return lb;
  60. } else return ub;
  61. }
  62.  
  63. int main()
  64. {
  65. scanf("%d",&t);
  66. while(t--){
  67. sum[]=;
  68. scanf("%d%d",&n,&m);
  69. if(n<=){
  70. printf("1\n");
  71. continue;
  72. }
  73.  
  74. for(int i=;i<=n;i++){
  75. scanf("%d",&a[i]);
  76. sum[i]=sum[i-]+a[i];
  77. }
  78. sort(a+,a++n);
  79. for(int i=;i<=n;i++){
  80. sum[i]=sum[i-]+a[i];
  81. }
  82. //printf("%d\n",judge(3));
  83. int ans=solve();
  84. printf("%d\n",ans);
  85. }
  86. return ;
  87. }

hdu5884的更多相关文章

  1. hdu5884 Sort(二分+k叉哈夫曼树)

    题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...

  2. hdu5884(多叉哈夫曼树)

    hdu5884 题意 给出 n 个数,每次选择不超过 k 个数合并(删掉这些数,加入这些数的和),花费为合并的这些数的和,要求最后只剩下一个数,问 k 最小取多少. 分析 二分 k,合并数的时候可以按 ...

  3. Sort HDU5884(二分+多叉哈夫曼树)

    HDU5884 Sort 题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k. 思路:还是太单纯,看完题目一直 ...

  4. hdu5884 Sort

    //--------------------------------------------------------------- /*---贪心策略+二分+队列 -----将原数组排序,然后每次取k ...

  5. hdu5884 Sort(二分)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  6. Sort(hdu5884)

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 在js实现矩阵转置

    var arr=[[2,4,6,8],[8,9,0,-1],[9,6,2,1]]; //定义一个新的数组 var arr2=[]; for(var i=0;i<arr[0].length;i++ ...

  2. findbugs规则

    FindBugs是基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug patterns,如NullPoint空指针检查 ...

  3. Hotel California

    On a dark desert highway行驶在昏黑的荒漠公路上cool wind in my hair凉风吹过我的头发warm smell of colutas温馨的大麻香rising up ...

  4. FAQrobot 聊天机器人笔记

    follow: https://github.com/ofooo/FAQrobot  这是一个简单的基于问词匹配的自动问答,获取与用户问句Q1最匹配的知识库中的问句Q2,Q2的答案就是Q1的答案. 首 ...

  5. linux C++ scandir 的使用

    () 头文件 #include <dirent.h> () 函数定义 int scandir(const char *dir,struct dirent **namelist,int (* ...

  6. NO0:重新拾起C语言

    因工作所需,重新捡起C语言,之前在学校里有接触过,但现在已经忘的一干二净了,现决定重新开始学习,为工作,为生活. 以<标准 C程序设计 第5版>的课程进行基础学习,同时以另外两本书为辅助, ...

  7. BZOJ3230 相似子串[后缀数组+二分+st表]

    BZOJ3230 相似子串 给一个串,查询排名i和j的子串longest common suffix和longest common prefix 思路其实还是蛮好想的,就是码起来有点恶心.可以发现后缀 ...

  8. JavaScript中的eval()函数详解

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作     eval(“1 ...

  9. Python手记

    字符串的拼接 1.“+”,如果是字符和数字相连,要使用str()函数对于数字进行字符转化: 2.join() 3.",",链接的两个字符串之间用空格做关联 4.占位符 tmp += ...

  10. bzoj 1202 [HNOI2005]狡猾的商人——带偏移量的并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1202 带偏移量的并查集. 注意先 find() 再调用 dis !!! 自己的对拍太水了. ...