专栏文章

题解:P13887 [蓝桥杯 2023 省 Python A] 三国游戏

P13887题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mio33dh9
此快照首次捕获于
2025/12/02 12:34
3 个月前
此快照最后确认于
2025/12/02 12:34
3 个月前
查看原文

题意

游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,ZX, Y, Z。游戏有 nn 个可能会发生的事件,每个事件最多只会发生一次,当第 ii 个事件发生时会分别让 X,Y,ZX, Y, Z 增加 Ai,Bi,CiA_i, B_i, C_i,游戏结束时如果有其中一个国家获胜,最多发生了多少个事件?

思路

分别考虑三家胜利的条件,优先选择一家比其他两家多的事件,然后从小到大考虑一家比其他两家少的事件,算出 33 个答案,取其中的最大值,就是此题的结果。
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
	int x,y; 
}a[100005],b[100005],c[100005];
int n,ans=INT_MIN;
bool cmp(node x,node y)
{
	return x.x-x.y>y.x-y.y;
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i].x;
	for(int i=1;i<=n;i++) cin>>b[i].x;
	for(int i=1;i<=n;i++) cin>>c[i].x;
	for(int i=1;i<=n;i++)
	{
		a[i].y=b[i].x+c[i].x;
		b[i].y=a[i].x+c[i].x;
		c[i].y=a[i].x+b[i].x;
	}
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cmp);
	sort(c+1,c+n+1,cmp);
	int op=0,op2=0; 
	a[n+1].y=1e18;
	b[n+1].y=1e18;
	c[n+1].y=1e18;
	for(int i=1;i<=n+1;i++)
	{
		op+=a[i].x;
		op2+=a[i].y;
		if(op<=op2)
		{
			if(i==1) break;
			ans=max(ans,i-1);
			break; 
		}
	}
	op=0,op2=0; 
	for(int i=1;i<=n+1;i++)
	{
		op+=b[i].x;
		op2+=b[i].y;
		if(op<=op2)
		{
			if(i==1) break;
			ans=max(ans,i-1);
			break; 
		}
	}
	op=0,op2=0; 
	for(int i=1;i<=n+1;i++)
	{
		op+=c[i].x;
		op2+=c[i].y;
		if(op<=op2)
		{
			if(i==1) break;
			ans=max(ans,i-1);
			break; 
		}
	}
	if(ans==INT_MIN) cout<<-1;
	else cout<<ans;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...