将树变成相同高度

题目描述

给你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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值