社区讨论

求助站外题

学术版参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo7hozil
此快照首次捕获于
2023/10/27 02:00
2 年前
此快照最后确认于
2023/10/27 02:00
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
int n,c,d;
int a[200003];
long long s[200003];
bool cmp(int a,int b){
	return a>b;
}
signed main(){
	cin>>t;
	while (t--){
		memset(s,0,sizeof(s));
		long long sum=0;
		cin>>n>>c>>d;
		for (int i=1;i<=n;i++){
			cin>>a[i];
			if (i<=d) sum+=a[i];
		}
		if (sum>c){
			printf("Infinity\n");
			continue;
		}
		sort(a+1,a+1+n,cmp);
		if (1LL*a[1]*d<c){
			printf("Impossible\n");
			continue;
		}
		int k=1;
		s[1]=a[1];
		while (d/k*s[k]+s[d%k]>=c){
			k++;
			s[k]=s[k-1]+a[k];
		}
		k-=2;
		cout<<k<<'\n';
	}
	return 0;
}

TLE了,应该这个地方k可能很大
CPP
while (d/k*s[k]+s[d%k]>=c){
	k++;
	s[k]=s[k-1]+a[k];
}
想了一个办法二分,但是这个计算要依靠前缀和,怎样才能写出这里的二分qwq
如果正解不是二分的话各位大佬稍微指点一下

回复

3 条回复,欢迎继续交流。

正在加载回复...