社区讨论

60分求条

P14520【MX-S11-T1】战争游戏参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mi1vdn7t
此快照首次捕获于
2025/11/16 23:27
3 个月前
此快照最后确认于
2025/11/17 09:09
3 个月前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int a[100000+5];

int main()
{
	int T,n;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		int lt=0,rt=n;
		while(lt+1<rt){//二分找第一个1的位置 
			int mid=(lt+rt)/2;
			int sum1=0,sum2=0;
			bool win1;
			for(int i=1;i<=mid;i++){
				sum1+=a[i];
			}
			for(int i=mid+1;i<=n;i++){
				sum2+=a[i];
			}
			if(sum1>sum2){//小L全部退防 
				win1=true;
			}
			else{
				if(a[mid]<=a[mid+1]){//无法攻占 小K退防 
					win1=false;
				}
				else if(sum1+a[mid+1]<=sum2-a[mid+1]){//可以攻占 但小K依然可以退防 
					win1=false;
				}
				else{
					if(mid+2<=n&&a[mid+1]+a[mid]<=a[mid+2]){//可以攻占 但小K可以再反杀
						win1=false;
					}
					else{//小K无法反杀 
						win1=true;
					}
				}
			}
			if(win1==false){
				lt=mid;
			}
			else{
				rt=mid;
			}
		}
		for(int i=1;i<n;i++){
			if(i<=lt) printf("0");
			else printf("1");
		}
		printf("\n");
	}
	return 0;
}
是整体思路有问题吗,还是哪里代码写错了?

回复

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

正在加载回复...