这题是群友问的 感觉有点好玩就写下
思路其实有两个 【1】二分 【2】 优先队列(堆)
【1】二分 ,代码在下面
最大值最小化 / 最小值最大化 ,是经典二分问题了
一共有k次操作,那肯定要全部用上才有利于答案减小
因此,二分 答案的数值,然后o(n)check 就完事
复杂度为 Nlog(K*X) ,和K有关,但是带log问题不大
【2】 优先队列 (stl调用即可,无代码)
先将所有数字全部放入队列中,然后修改k次即可
每一次top,push,pop, 复杂度为 log(n)
一共进行 k 次操作
总复杂度 Klog(N) ,和 A的数值无关
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型vector
* @param k int整型
* @param x int整型
* @return int整型
*/
typedef long long ll;
int minMax(vector<int>& ar, int k, int x) {
int n=ar.size();
cout<<n<<endl;
ll inf = 1e18;
ll l=-inf,r=inf,mid;
r = *max_element(ar.begin(),ar.end());
l = r;
l -= k*x;
while(l<r){
mid = l+r>>1;
ll cnt=0;
for(int i=0;i<n;++i){
int a= ar[i];
if(a>mid){
cnt += (a-mid+x-1)/x;
}
}
if(cnt>k){
l=mid+1;;
}
else{
r=mid;
}
}
return r;
// write code here
}
};