思路:训练的时候想暴力,从小到大排序,遍历每一个数,找以这个数为目标可以转化多少个数。
然后果不其然超时,想了很多办法预处理求每个数朝前可以扩展的个数,网上看到一个代码,哇,茅塞顿开,简直不要太优雅。
既然预处理每个数需要扩展的大小很难,我们可以反过来求连续数的和,从而求出。
(说的可能不清楚...具体看代码吧还是)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#define max_ 100010
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int n,k;
int num[max_];
int main(int argc, char const *argv[]) {
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>num[i];
sort(num+1,num+1+n);
ll sum=0;
ll maxx=-1,ma;
int i=1,j=1;
for(;i<=n;i++)
{
sum+=num[i];
while((num[i]*(i-j+1LL)-sum)>k)
{
sum-=num[j++];
}
if(maxx<i-j+1LL)
{
maxx=i-j+1;
ma=num[i];
}
}
printf("%lld %lld\n",maxx,ma);
return 0;
}