cf--Ran and the Lock Code

题意:n个数的平均值是a,求n个数的组成中,最多有多少个不同的数
思路:n个数的和是sum=n*a,假设有x个数不同,可以把这x个数化成1.2.3....x,(这x个数取最小,最小是1,2,3...x,)剩下的 (n-x)个数的和是s=(sum-((1+x)*x/2)),因为每个数都是>=1的数,所以s>=(n-x);代入得(1+x)*x/2+(n-x)<=(n*a);因为对x在[1,+∞]单调增,可以对x进行二分求x最大值。
感想:这个题是昨天比赛的题,因为matlab考试所以没有打,赛后看了看,这个题很多做的但是没有A,就补了这一个。。然后还是先去做女赛专项吧。。
代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f;
#define mod 1000000007
long long n,T,ans,m,x;
long long erfen(long long p,long long all)
{
    long long mid=-1,l=1,r=n;
    while(1)
    {
        if(mid==(l+r)/2) break;
        mid=(l+r)/2;
        if((1+mid)*mid/2+(n-mid)>all) r=mid;
        else l=mid;
    }
    //mid=r;
    //if((1+mid)*mid/2+(n-mid)<=all) l=mid;
    return l;
}
int main()
{
   scanf("%lld",&T);
   while(T--)
   {
       scanf("%lld%lld",&n,&m);
       if(m==1) printf("1\n");
       else if(((1+n)*n/2)<=(n*m))//这种情况可以放在二分内对r判断解决。
       {
           printf("%lld\n",n);
       }
       else
       {
           x=erfen(n,n*m);
           printf("%lld\n",x);
       }

   }
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/80313073