码积木——题解
来源:学校oj,网址不能放出来,希望大家见谅。
题目描述:
小马面前一共有n堆积木,第i堆积木的高度为A[i]。
他每次操作可以往任意一堆积木顶部放一个零件,使这堆积木的高度增加1。
为了使每堆积木的高度都不一样,小马最少需要几次操作呢?
输入:
第一行输入一个非负整数n;
第二行输入n个非负整数,表示A[i];
输出:
输出一个非负整数,表示最少需要的回合数。
输入样例:
【输入样例1】
3
2 3 2
【输出样例1】
2
【输入样例2】
5
3 7 5 2 6
【输入样例2】
0
【输入样例3】
7
2 1 4 7 8 9 1
【输入样例3】
2
样例解释:
例如:一共有3堆积木,高度分别是2 3 2,
则最少需要2次操作,使高度变成2 4 3或者2 3 4或者4 3 2
数据范围和约定:
对于30%的数据,1<=n<=10 ;
对于75%的数据,0<=A[i]<=10;
对于100%的数据,1<=n<=40000,0<=A[i]<=40000;时间限制:1000MS 内存限制:256000KB
思路:
题意很容易理解,就是给我们n堆建筑,要求每一堆的高度都不尽相同,我们可以花费1代价,往任意一堆建筑的高度加1,最后求最小花费代价数。我们很快就能想到一个朴素做法:将给出的建筑高度排序,从前往后遍历,遇到相同的就让a[i + 1]++,同时代价 + 1,保持升序,这样似乎也行,所给的三个样例也都能过。但是,这样交上去,最多拿