给定一个长度为n的序列a1,a2…an,请你把其中一些数进行若干次+1操作,且操作总次数不超过k,使得原序列中某数出现的次数最多。求操作之后相同的数出现最多的次数,以及相应的这个数。
第一行两个整数 n,k,即序列的长度和操作总次数;
第二行为a1,a2…an。
两个整数,以空格分隔,分别为出现最多的数的次数和出现最多的数。
如果有多个满足条件的数,输出值最小的一个。
5 3
6 3 4 0 2
3 4
3 4
5 5 5
3 5
5 3
3 1 2 2 1
4 2
#include <bits/stdc++.h>
using namespace std;
long long int a[1001001];
long long int f[1001001];
long long int n,m;
bool check(long long int s)
{
long long int q=m;
long long int p=0;
long long int k=0;
long long int ll=1,rr=1;
for(long long int i=1; i<=n; i++) {
long long int h;
p=q;
k=0;
for(long long int j=1; j<=n; j++) {
if(i!=j&&a[i]>=a[j]) {
if(p>0) {
f[rr]=abs(a[i]-a[j]);
p-=f[rr];
rr++;
k++;
} else {
ll++;
p+=f[ll-1];
k--;
}
if(k>=s) return true;
}
}
}
if(p>=0) {
if(k>=s) return true;
}
return false;
}
int main()
{
cin>>n>>m;
for(long long int i=1; i<=n; i++) {
cin>>a[i];
}
long long int l=1;
long long int r=n;
long long int mid;
long long int ans;
while(l<=r) {
mid=(l+r)/2;
if(check(mid)) {
ans=mid;
l=mid+1;
} else {
r=mid-1;
}
}
cout<<ans+1<<" "<<a[ans+1];
return 0;
}
