Sort(hdu5884)
Sort
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1038 Accepted Submission(s): 231
Alice will give Bob N sorted sequences, and the i-th sequence includes ai elements. Bob need to merge all of these sequences. He can write a program, which can merge no more than k sequences in one time. The cost of a merging operation is the sum of the length of these sequences. Unfortunately, Alice allows this program to use no more than T cost. So Bob wants to know the smallest k to make the program complete in time.
For each test case, the first line consists two integers N (2≤N≤100000) and T (∑Ni=1ai<T<231).
In the next line there are N integers a1,a2,a3,...,aN(∀i,0≤ai≤1000).
5 25
1 2 3 4 5
1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 #include<iostream>
5 #include<queue>
6 #include<stdlib.h>
7 #include<math.h>
8 #include<set>
9 using namespace std;
10 typedef long long LL;
11 queue<int>que1;
12 queue<int>que2;
13 LL ans[100005];
14 bool check(int mid,int N,LL T);
15 int main(void)
16 {
17 int n;
18 scanf("%d",&n);
19 while(n--)
20 {
21 int N;
22 LL T;
23 scanf("%d %lld",&N,&T);
24 for(int i = 0; i < N; i++)
25 {
26 scanf("%lld",&ans[i]);
27 }
28 sort(ans,ans+N);
29 int id = 1;
30 int l = 2;
31 int r = N;
32 while(l<=r)
33 {
34 int mid = (l+r)/2;
35 if(check(mid,N,T))
36 {
37 r = mid-1;
38 id = mid;
39 }
40 else l = mid+1;
41 }
42 printf("%d\n",id);
43 }
44 return 0;
45 }
46 bool check(int mid,int N,LL T)
47 {
48 LL ask = 0;
49 while(!que1.empty())
50 {
51 que1.pop();
52 }
53 while(!que2.empty())
54 {
55 que2.pop();
56 }
57 int x = (N-1)%(mid - 1);
58 if(x!=0)
59 {
60 x = (mid-1-x)%(mid-1);
61 while(x)
62 {
63 que1.push(0);
64 x--;
65 }
66 }
67 for(int i = 0; i < N ; i++)
68 {
69 que1.push(ans[i]);
70 ask-=ans[i];
71 }
72 while(true)
73 {
74 LL sum = 0;
75 int c = mid;
76 while(c)
77 {
78 int flag = 0;
79 if(!que1.empty()&&!que2.empty())
80 {
81 int t = que1.front();
82 int tt = que2.front();
83 if(t<=tt)
84 {
85 que1.pop();
86 }
87 else
88 {
89 t = tt;
90 que2.pop();
91 }
92 sum+=t;
93 c--;
94 flag = 1;
95 }
96 else if(!que1.empty())
97 {
98 int t = que1.front();
99 que1.pop();
100 sum+=t;
101 c--;
102 flag = 1;
103 }
104 else if(!que2.empty())
105 {
106 int t = que2.front();
107 que2.pop();
108 sum+=t;
109 c--;
110 flag = 1;
111 }
112 if(!flag)
113 break;
114 }
115 que2.push(sum);
116 ask += sum;
117 if(c>0)break;
118 }
119 if(ask > T)
120 return false;
121 else return true;
122 }
Sort(hdu5884)的更多相关文章
- Sort HDU5884(二分+多叉哈夫曼树)
HDU5884 Sort 题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k. 思路:还是太单纯,看完题目一直 ...
- hdu5884 Sort(二分+k叉哈夫曼树)
题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...
- hdu5884 Sort
//--------------------------------------------------------------- /*---贪心策略+二分+队列 -----将原数组排序,然后每次取k ...
- hdu5884 Sort(二分)
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- hdu5884(多叉哈夫曼树)
hdu5884 题意 给出 n 个数,每次选择不超过 k 个数合并(删掉这些数,加入这些数的和),花费为合并的这些数的和,要求最后只剩下一个数,问 k 最小取多少. 分析 二分 k,合并数的时候可以按 ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- shell之sort命令
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...
- 详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...
随机推荐
- 编程艺术第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性Hash算法
目录(?)[+] 第十六~第二十章:全排列,跳台阶,奇偶排序,第一个只出现一次等问题 作者:July.2011.10.16.出处:http://blog.csdn.net/v_JULY_v. 引言 ...
- (转载) Java多线程技术
多线程编程一直是学员们比较头痛和心虚的地方,因为线程执行顺序的不可预知性和调试时候的困难,让不少人在面对多线程的情况下选择了逃避,采用单线程的方式,其实只要我们对线程有了明确的认识,再加上java内置 ...
- Identity Server 4 从入门到落地(三)—— 创建Web客户端
书接上回,我们已经搭建好了基于Identity Server 4的认证服务和管理应用(如果还没有搭建,参看本系列前两部分,相关代码可以从github下载:https://github.com/zhen ...
- CAN总线常见的两种编码格式(Intel/Motorola)
在汽车电子行业的开发或者测试中,我们经常会看到CAN总线信号的常见的两种编码格式:Intel格式与Motorola格式. 讲解这两种格式之前,我们先来了解一些大端模式和小端模式,会对后面理解这两种编码 ...
- 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...
- Linux系统信息查看命令(ZZ)
http://hi.baidu.com/thinkdifferent/blog/item/22f4a80161630e011d958384.html转自一个baidu师兄的博客,很好的一个总结,推荐下 ...
- RunLoop基础知识以及GCD
- 1.1 字面意思 a 运行循环 b 跑圈 - 1.2 基本作用(作用重大) a 保持程序的持续运行(ios程序因而能一直活着不会死) b 处理app中的各种事件(比如触摸事件 ...
- 超过三张表禁止join
一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过三张表禁止join,这是为什么? 二.问题分析 对这个结论,你是否有怀疑呢?也不知道是哪位先哲说的不要人云亦云,今天我设计sql,来验 ...
- Spring组合注解与元注解
目录 注解说明 源代码 使用范例 注解说明 元注解:可以注解到别的注解上的注解,所以元注解首先基于条件@Target({ElementType.TYPE}) ,目标使用在类文件上 . 组合注解:连个元 ...
- 捷码:重塑DevOps,打造更流畅紧密的开发与服务交付业务链
捷码Gemcoder 1周前如果有机会安排一场行业吐槽大会,熟悉软件开发.交付.服务业务各环节的业内人士,对开发中的各种扯皮.交付反反复复.运维服务中的提心吊胆,往往会有很多深刻的体验和刻骨铭心的案例 ...