列表

详情


NC224938. 加减

描述

小红拿到了一个长度为  的数组。她每次操作可以让某个数加 1 或者某个数减 1 。
小红最多能进行  次操作。她希望操作结束后,该数组出现次数最多的元素次数尽可能多。
你能求出这个最大的次数吗?

输入描述

第一行两个正整数 
第二行有  个正整数




输出描述

不超过  次操作之后,数组中可能出现最多次数元素的次数。

示例1

输入:

5 3
6 3 20 8 1

输出:

2

说明:

共 3 次操作如下:
第一个数加一。
第二个数加一。
第四个数减一。
数组变成了 7 4 20 7 1 ,共有 2 个相同的数: 7 。
可以证明, 2 为最优解。另外,此上操作并不是唯一的操作。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 53ms, 内存消耗: 2188K, 提交时间: 2022-12-22 15:04:46

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll n,k;
ll a[100010];
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)a[i]+=a[i-1];
    ll l=1,r=2;
    ll ans=1;
    while(l<=n&&r<=n)
    {
        ll m=(l+r)>>1;
        ll x=a[m]-a[m-1];
        if(x*(m-l+1)-a[m]+a[l-1]+a[r]-a[m]-x*(r-m)<=k)ans=max(ans,r-l+1),r++;
            else l++;
    }
    cout<<ans;
    return 0;
}

Python3 解法, 执行用时: 508ms, 内存消耗: 15832K, 提交时间: 2022-10-26 23:40:23

n,k=map(int,input().split())
arr = list(map(int,input().split()))
arr.sort()
arr1 = [0 for i in range(n+1)]
for i in range(1,n+1):
    arr1[i]=arr1[i-1]+arr[i-1]    
p1=0
p2=0
maxlen=1
while(p2<n):
    p=(p2+p1)//2
    step= arr[p]*(p-p1+1)-(arr1[p+1]-arr1[p1]) +arr1[p2+1]-arr1[p+1]-arr[p]*(p2-p)
    if(step<=k):
        maxlen=max(maxlen,p2+1-p1)
        p2=p2+1
    elif p1<p2:
        p1=p1+1
print(maxlen)

上一题