做法:进行从小到大排序,这样可以使最接近的几个数都聚在一起,然后用(i-j+1)*a[i]-sum;sum-=a[j++];这样可以以i-j+1为重复次数,算出重复最多的数,然后以为是从小到大排列的,又可以找出最小数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <utility>
#define LL long long
#define LMT 100003
//化分离数为块,贪心题
using namespace std;
int a[LMT];
int main()
{
int n,k;
LL sum=0;
pair<int,int> ans;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
ans.first=0;ans.second=0;
for(int i=0,j=0;i<n;i++)
{
sum+=a[i];
while((i-j+1LL)*a[i]-sum>k)sum-=a[j++];
if(ans.second<i-j+1LL)
ans=make_pair(a[i],i-j+1LL);
}
printf("%d %d\n",ans.second,ans.first);
return 0;
}