该题可以这么认为:经过一系列操作后,出现次数最多的数一定是原数组中的数,所以将原数组排序后,枚举每一个元素,计算数组中有多少个数能转换成该元素,计算过程就用二分实现了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#define LL __int64
using namespace std;
const int INF=1e5+5;
LL num[INF],sum[INF];
LL Cal(LL l,LL r) //计算num[l]变成num[r]需要加多少个数
{
LL temp=sum[r]-sum[l-1];
temp=num[r]*(r-l+1)-temp;
return temp;
}
LL erfen(LL s,LL k) //二分计算该数组中能转换出多少个num[s]
{
LL l(1),r(s);
while(l<r)
{
LL mid=(l+r)/2;
LL temp=Cal(mid,s);
if(temp>k) l=mid+1;
else r=mid;
}
return s-l+1;
}
int main()
{
LL n,k;
while(~scanf("%I64d%I64d",&n,&k))
{
for(LL i=1;i<=n;i++)
scanf("%I64d",&num[i]);
sort(num+1,num+n+1);
sum[0]=0;
for(LL i=1;i<=n;i++) //计算前i个元素和(包括第i个元素)
sum[i]=sum[i-1]+num[i];
LL mx(0),res;
for(LL i=1;i<=n;i++) //枚举数组中每一个元素
{
LL temp=erfen(i,k);
if(mx<temp)
{
mx=temp; res=num[i];
}
}
printf("%I64d %I64d\n",mx,res);
}
return 0;
}