题目描述
给你N棵树,每棵树都有一个高度a[i], (N和a[i]都是一百万数量级)你每次可以施展魔法让其中一棵树不生长而其它树高度都加一,问最少几次魔法可以使得所有树一样高。
分析
这边分析得到:就是要想把第二高的树变成最高层次哪一类需要施的魔法次数tem=高度差h_c(开始时最高树与第二高树之间的高度差)x 开始最高树的数量max_count,之后经过此类操作。把数组树的第二高的树都变成最高层次的哪一类(高度为开始次高树高度+tem)
实现
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int main()
{
int n;
while (cin >> n) {
vector<int>arr(n + 1, 0);
for (int i = 1; i <= n; i++) cin >> arr[i];
sort(arr.begin()+1,arr.end(),cmp);//从大到小排序
//reverse(arr.begin()+1, arr.end());
//for (int i = 1; i <= n; i++) cout << arr[i] << " ";
//cout << endl;
//int max_value = *max_element(arr.begin() + 1, arr.end());
int max_count =count(arr.begin(), arr.end(),arr[1]);//计算最大值的数量
int h_c=0, tem=0, sum=0; //最好赋予初值,当输入一样时,它没有初值
while(max_count +1<= n) {
h_c = arr[1] - arr[max_count + 1];
tem = h_c * max_count;//把第二高树变成最高那层次需要的施魔法的次数
arr[max_count + 1] += tem; //此时数组中树最大高度
for (int i = 1; i <= max_count; i++) {
arr[i] = arr[max_count + 1];
}
for (int i = max_count + 2; i <= n; i++) {
arr[i] += tem;
}
sum += tem;//施魔法的次数
max_count = count(arr.begin(), arr.end(), arr[1]);//计算最大值的数量
}
cout << sum << endl;
}
return 0;
}