Minimizing Difference 【思维】

题目链接:

https://vjudge.net/contest/336389#problem/B

题目大意:

给出一个长度为n的数列以及操作次数k。k的范围为1e14。每次操作都可以选择给任意一个数加1或者减1。问k次操作后,数列中最大值与最小值的差值最小是多少。

解题思路:

1.可以用二分

2.思维,对数组进行排序,同时计算前后两个方向。具体看代码:

 1 #include<stdio.h>
 2 #include<algorithm>
 3 typedef long long ll;
 4 const int MAXN = 1e5 + 100;
 5 using namespace std;
 6 
 7 ll a[MAXN];
 8 ll n, k, temp, ans;
 9 
10 int main()
11 {
12     scanf("%lld%lld", &n, &k);
13     for(int i = 1; i <= n; i ++)
14         scanf("%lld", &a[i]);
15     sort(a + 1, a + 1 + n);
16     for(int i = 1; i <= n / 2; i ++)
17     {
18         int j = n - i + 1;
19         temp = (a[i + 1] - a[i] + a[j] - a[j - 1]) * i; //将前i个都变成a[i + 1]以及将后i个全变成a[j]所需要的操作次数 
20         if(temp <= k)
21             k -= temp;
22         else
23         {
24             ans = a[j] - a[i] - k / i; //剩余操作次数可否使某一边都作贡献 
25             break;
26         }
27     }
28     printf("%lld
", ans);
29     return 0;
30 }
View Code
原文地址:https://www.cnblogs.com/yuanweidao/p/11709157.html