1 条题解
-
0
首先,在满足题意的情况下,最大的答案肯定为n,最小的答案肯定是1,那答案的范围就是从1到n,那么我们就可以从1到n去遍历,看哪一种情况符合题意,该怎么判断呢?首先,我们能得到的大红数量一共为sum+k,而此时一组当中的数量为i(从1到n遍历,用i表示分组数量),(sum+k)/i代表我们最多能分多少组,一组有i个大红,那所以(sum+k)/ii就表示一组有i个大红的情况下,大红的总数量,我们最少要分sum个大红,最多要分sum+k个大红,那如果此时的i成立,那就要满足(sum+k)/ii>=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
- 上传者