hiho1619“共同富裕”

来源:互联网 发布:微信模板消息 java 编辑:程序博客网 时间:2024/06/09 15:18

#1619 : “共同富裕”

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个数组A1, A2, ... AN,每次操作可以从中选定一个元素Ai,把除了Ai之外的所有元素都加1。  

问最少几次操作可以实现“共同富裕”,即数组中所有元素都相等。

例如对于[1, 1, 1, 2, 3]经过3步:[1, 1, 1, 2, 3] -> [2, 2, 2, 3, 3] -> [3, 3, 3, 3, 4] -> [4, 4, 4, 4, 4]。

输入

第一行包含一个整数N。(1 ≤ N ≤ 100000)  
以下N行包含N个整数A1, A2, ... AN。 (1 ≤ Ai ≤ 100000)

输出

最小的操作数

样例输入
5  1  1  1  2  3
样例输出
3



思路:题目描述就是题意了,很明确。那么要想每个数都相等,并且操作数最少,那么在这些操作里面,我们一定

不能取最小值的数,因为取出来以后,只会让这个数跟比它大的数相差更大,是远离最终目标的。

所以如果是模拟来做的话,就是每次取最大的数,这样才不至于取出的数跟比它大的数相差更远。

那么对于最小值而言,是不会被取出的,因为总有比它大的数,而当它跟别的数一样大的时候,操作就结束了。

所以,最小的数在全过程中的每步操作都是被+1,而最小数增长到跟比它大的数一样的机会就是这个大数被拿

出去了,这样小数+1,大数不变,才可以缩小差距,每次操作都有数被拿出去。所以要想缩小全部差距,就计算一下

其它数比最小数一共大多少


#include <bits/stdc++.h>using namespace std;typedef long long ll;#define INF 0x3f3f3f3fint mod = 1000000007;const int N = 101000;int rec[N];int main() {    int n;    while (~scanf("%d", &n))    {        for (int i = 0; i < n; i++)            scanf("%d", rec + i);        sort(rec, rec + n);        ll ans = 0;        int a = rec[0];        for (int i = 0; i < n; i++)            ans += rec[i] - a;        cout<<ans<<endl;    }    return 0;}



原创粉丝点击