竞技比赛二分0pts求救!!!

咋写那么长?

因为他把二分单独写了个函数

WA0pts

#include<bits/stdc++.h>
using namespace std;
int n;
int cnt;//赢得次数 
long long a[100005];
long long sum[100005];
bool cmp(long long x,long long y){
	return x<y;
}
bool win(int ii){//判断编号为ii的队伍是否能获胜 
	long long now=sum[ii];
	for(int j=ii+1;j<=n;j++){
		if(now>=a[j]){
			now+=a[j];
			continue;
		}
		return 0;
	}
	return 1;
}
void fen_2(){
	int l=1;
	int r=n;
	while(l<r){
		int mid=(l+r)/2;//假设有mid个队伍能获胜,则意味着获胜范围为n-mid+1,n
		if(win(n-mid+1)){//如果这个范围中魔法值最低的队伍也能获胜 
			r=mid;
		}
		else{
			l=mid+1;
		}
	}
	cout<<l<<endl;
	if(l*2>=n){
		cout<<"YES";
	}
	else{
		cout<<"NO";
	}
}

int main(){
	//freopen("game.in","r",stdin);
	//freopen("game.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	if(n==1){
		cout<<1<<endl;
		cout<<"YES";
		return 0;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+a[i];
	}
	/*
	for(int i=1;i<=n;i++){
		cout<<win(i)<<endl;
	}
	*/
	fen_2();
	return 0;
}
/*

*/

请格式化

我来抢解决了

不要直接输出 l ,输出 n-l+1

这个写错了,因为你二分的是能获胜的队伍数量,所以应该是:

        if(win(n-mid+1)){//如果这个范围中魔法值最低的队伍也能获胜 
			l=mid;
		}
		else{
			r=mid-1;
		}

然后前面的应该是:

int mid=(l+r+1)/2;

还是0 :sweat_smile:

#include<bits/stdc++.h>
using namespace std;
int n;
int cnt;//赢得次数 
long long a[100005];
long long sum[100005];
bool cmp(long long x,long long y){
	return x<y;
}
bool win(int ii){//判断编号为ii的队伍是否能获胜 
	long long now=sum[ii];
	for(int j=ii+1;j<=n;j++){
		if(now>=a[j]){
			now+=a[j];
			continue;
		}
		return 0;
	}
	return 1;
}
void fen_2(){
	int l=1;
	int r=n;
	while(l<r){
		int mid=(l+r)/2;//假设有mid个队伍能获胜,则意味着获胜范围为n-mid+1,n
		if(win(n-mid+1)){//如果这个范围中魔法值最低的队伍也能获胜 
			r=mid;
		}
		else{
			l=mid+1;
		}
	}
	cout<<n-l+1<<endl;
	if(l*2>=n){
		cout<<"YES";
	}
	else{
		cout<<"NO";
	}
}

int main(){
	//freopen("game.in","r",stdin);
	//freopen("game.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	if(n==1){
		cout<<1<<endl;
		cout<<"YES";
		return 0;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+a[i];
	}
	/*
	for(int i=1;i<=n;i++){
		cout<<win(i)<<endl;
	}
	*/
	fen_2();
	return 0;
}
/*

*/

他二分的是能获胜的队伍数量

@杨思越 还是写 l,按我的来

win(n-mid+1) 改为 win(n)

哦不对是 win(mid)

为啥?是对的啊

说了他二分的是能获胜的队伍数量

图片
点击这里

方向错了

能获胜队伍的数量是单调递减不是单调递增

image
我这边是能过的

你有没有想过他这个为什么这么卡?


因为这题没有解决方案,他想把这句打码!!!