题目链接:
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 }