因为在网上看了这个题,没有java语言写的,我就用java写了一份(题目来源于网络)
题目描述
服务器在做数据备份,需要传输一批文件。在任意时间只能有一个文件被传输,一个文件传输需要一秒。
现在有n批文件,我们知道这批文件加入传输队列的时间(单位:秒),以及这批文件的个数C。
传输队列中的文件会以一秒一个文件的速度进行传输。
现在负责传输文件的同学想知道,所有文件被传输完的时刻,以及传输队列中文件堆积最大数量。
输入描述:
第一行一个整数n,代表有n批文件。
接下来n行每行两个整数t,c,代表这批文件加入队列时间和这批文件的个数。
对于50%的数据
1<= n <=10^3
1<= t, c <= 10^6
对于50%的数据
1<= n <=10^5
1<= t, c <= 10^9
输出描述
输出一行两个整数,所有文件被传输完的时刻和传输队列文件堆积的最大数量。
示例1
输入
3
1 1
2 1
3 1
输出
4 1
示例1说明
1秒时第一批文件到来,一个文件被加入队列;
2利时第二批文件到来,此时队列中那个文件已经传完成,文件加入队列后队列内文件数仍然是1;
3秒时同理;
4秒时第三批的文件传输完成。
示例2
输入
3
1 3
2 3
3 3
输出
10 7
主要的思路在于文件的上送前后的差值,注意需要排序,题中没说是按照顺序。
import java.util.*;
public class Main7 {
static class heap{
int time;
int num;
public heap(int time, int num) {
this.time = time;
this.num = num;
}
}
static int heap_time = 0;
static long heap_sum = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
List<heap> list = new ArrayList<>();
int n = in.nextInt();
for (int i = 0; i < n; i++) {
list.add(new heap(in.nextInt(),in.nextInt()));
}
Collections.sort(list, new Comparator<heap>() {
@Override
public int compare(heap o1, heap o2) {
return o1.time - o2.time;
}
});
heap_time = list.get(0).time + + list.get(0).num;
heap_sum = list.get(0).num;
for (int i = 1; i < list.size(); i++) {
int i1 = heap_time - list.get(i).time;
if(i1 == 0){
heap_time += list.get(i).num;
}else if(i1 > 0 ){
heap_time = heap_time + list.get(i).num;
heap_sum = Math.max(i1+list.get(i).num,heap_sum);
}else {
heap_time = heap_time + (-1 * i1) + list.get(i).num;
heap_sum = Math.max(list.get(i).num,heap_sum);
}
}
System.out.println(heap_time+" "+heap_sum);
}
}