题意: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); } } }