1 条题解

  • 0
    @ 2025-11-2 23:33:04

    首先,在满足题意的情况下,最大的答案肯定为n,最小的答案肯定是1,那答案的范围就是从1到n,那么我们就可以从1到n去遍历,看哪一种情况符合题意,该怎么判断呢?首先,我们能得到的大红数量一共为sum+k,而此时一组当中的数量为i(从1到n遍历,用i表示分组数量),(sum+k)/i代表我们最多能分多少组,一组有i个大红,那所以(sum+k)/i*i就表示一组有i个大红的情况下,大红的总数量,我们最少要分sum个大红,最多要分sum+k个大红,那如果此时的i成立,那就要满足(sum+k)/i*i>=sum,满足这一个条件是不够的,当我们没有在交易行购买的大红时,也就是在我们初始的大红中,一定有一种大红的数量最大(用max1表示),由于同一组不能有相同种类的大红,那在一组由i个大红的条件下,(sum+k)/i>=max1,当上述两个条件成立时,此时,i成立,但是我们不能退出循环,因为题中要找最大的i,因此,我们要找最后一个符合上述条件的i
    #include<bits/stdc++.h>
    using namespace std;
    long long a[200100];
    int main(){
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
    long long n,k;
    scanf("%lld%lld",&n,&k);
    long long sum=0,max1=-1;
    for(int i=1;i<=n;i++){
    scanf("%lld",&a[i]);
    sum+=a[i];
    max1=max(max1,a[i]);//max是c++的比较函数,此处用来比较max1和a[i]的大小,把大的值赋值给max1,用来达到找出初始大红中的最大数量。
    }
    int ans=0;
    for(int i=1;i<=n;i++){
    if((sum+k)/i*i>=sum&&(sum+k)/i>=max1){
    ans=i;
    }
    }
    printf("%d\n",ans);
    }
    return 0;
    }

    信息

    ID
    1173
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    56
    已通过
    15
    上传者