Codeforces-231C-To Add or Not to Add(二分搜索)

来源:互联网 发布:装修网站 知乎 编辑:程序博客网 时间:2024/05/16 14:53

点击打开题目链接

该题可以这么认为:经过一系列操作后,出现次数最多的数一定是原数组中的数,所以将原数组排序后,枚举每一个元素,计算数组中有多少个数能转换成该元素,计算过程就用二分实现了。

#include <iostream>#include <cstdio>#include <algorithm>#define LL __int64using 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;}


原创粉丝点击