【解决悬关】,站外题,样例过了,0分
  • 板块灌水区
  • 楼主Jasonshan10
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/7/12 12:43
  • 上次更新2023/11/3 10:21:10
查看原帖
【解决悬关】,站外题,样例过了,0分
782125
Jasonshan10楼主2023/7/12 12:43

#include <bits/stdc++.h>
using namespace std;
const int MAXN=200001;
long long a[MAXN],b[MAXN],n,k;
long long check(long long mid,long long sum){
	long long ans=mid;
	if(ans>=sum){
		return 1;
	}
	//printf("%lld %lld\n",mid,sum);
	for(int i=1;i<=min(mid,n-1);++i){//i表示赋值
		int jy=mid-i;
		ans=b[n]-b[n-i]+(i+1)*jy;
		//printf("%d %lld %d %lld\n",i,b[n]-b[n-i],(i+1)*jy,ans);
		if (sum<=ans){
			//printf("%lld %lld\n",ans,sum);
			return 1;
		}
	}
	return 0;
}
int main(){
	int T;
	scanf("%d",&T);
	while (T--){
		memset(b,0,sizeof(b));
		long long sum=0,res;
		scanf("%lld %lld",&n,&k);
		for(int i=1;i<=n;++i){
			scanf("%lld",&a[i]);
			sum+=a[i];
		}
		sum=sum-k;
		if (sum<=0){
			printf("0\n");
			continue;
		}
		sort(a+1,a+n+1);
		for(int i=2;i<=n;++i){
			b[i]=b[i-1]+a[i]-a[1];
		}
		/*printf("%lld\n",n);
		for(int i=1;i<=n;++i){
			printf("%lld ",b[i]);
		}
		printf("\n");*/
		long long l=1,r=10000001;
		while (l<=r){
			long long mid=(l+r)/2;
			if (check(mid,sum)==0){
				l=mid+1;
			}
			else{
				res=mid;
				r=mid-1;
			}
		}
		printf("%lld\n",res);
	}
	return 0;
}
2023/7/12 12:43
加载中...