1088B--Ehab and subtraction

题目

You’re given an array a. You should repeat the following operation k times: find the minimum non-zero element in the array, print it, and then subtract it from all the non-zero elements of the array. If all the elements are 0s, just print 0.

Input

The first line contains integers n and k (1≤n,k≤10^5), the length of the array and the number of operations you should perform.

The second line contains n space-separated integers a1,a2,…,an (1≤ai≤10^9), the elements of the array.

Output

Print the minimum non-zero element before each operation in a new line.

Examples
input
3 5
1 2 3
output
1
1
1
0
0
input
4 2
10 3 5 3
output
3
2
Note

In the first sample:

In the first step: the array is [1,2,3], so the minimum non-zero element is 1.

In the second step: the array is [0,1,2], so the minimum non-zero element is 1.

In the third step: the array is [0,0,1], so the minimum non-zero element is 1.

In the fourth and fifth step: the array is [0,0,0], so we printed 0.

In the second sample:

In the first step: the array is [10,3,5,3], so the minimum non-zero element is 3.

In the second step: the array is [7,0,2,0], so the minimum non-zero element is 2.

题意:给一个长度为n的数组,操作k次,找到这个数组的最小值,并输出它,接下来的数组不为0的元素减去上一次最小的数,并输出最小值,如果数组全为0,则输出0
解题思路:本题,如果使用常规的排序方法,当数据非常多时,会导致时间超时,所以本题使用堆排序,将不为0的元素全存入到小根堆中,然后遍历小根堆,设置一个最小值变量count,每次获得小根堆中的最小数减去之前累加的最小值和所得不为0的值存入到一个长度为k的数组中。
注意:当遍历小根堆时,小根堆的数据元素会有可能大于数组的长度,所以增加数组长度控制语句,防止数组溢出。
AC–Code
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

import javax.swing.Box.Filler;

public class CF1088B {
	public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);
			int n = sc.nextInt();
			int k = sc.nextInt();
			int[] c = new int [k];
			Arrays.fill(c, 0);
			PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
			for(int i =0;i<n;i++)
			{
				int a = sc.nextInt();
				if(a!=0)
				{
					minHeap.add(a);
				}
			}
			int count = 0;
			int f =0;
			while(!minHeap.isEmpty())
			{
				int a = minHeap.poll()-count;
				if(a!=0&&f<k)
				{
					c[f] = a;
					f++;
					count+= a;
				}
			}
			for(int i =0;i<k;i++)
			{
				System.out.println(c[i]);
			}
			sc.close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>