牛客小白月赛37 I 加减
Posted CCSU_Cola
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客小白月赛37 I 加减相关的知识,希望对你有一定的参考价值。
思路:枚举l,二分一个r,判断区间内全等于一个值是否满足修改次数小于等于k,因为区间是排序过的,所以只需拿出中位数,然后判断其他数到修改为中位数需要的修改次数是否小于等于k。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100010];
ll sum[100010];
ll check(int l,int r){
int mid=(l+r)>>1;
return a[mid]*(mid-l+1)-sum[mid]+sum[l-1]+(sum[r]-sum[mid])-a[mid]*(r-mid);
}
int main(){
ll n,k;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
int res=1;
for(int i=1;i<=n;i++){
int l=i,r=n,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(i,mid)<=k){
ans=max(ans,mid-i+1);
l=mid+1;
}
else r=mid-1;
}
res=max(res,ans);
}
printf("%d\\n",res);
}
以上是关于牛客小白月赛37 I 加减的主要内容,如果未能解决你的问题,请参考以下文章