解题思路:
将每个事件中某一个国家的兵力增加量减去其余两国兵力增加量视为事件对该国的贡献,将贡献由大到小排序后遍历,找到第一个该国没赢的状态,此时所经历的事件数-1即为该国赢时的最大事件数。

参考代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;

//每次事件
struct event {
	//a为魏国兵力增加数,b为蜀国,c为江东鼠辈,ctb为该事件对某国的贡献
	//贡献为在该事件下该国兵力增加数减去其他两国兵力增加数,若我们将贡献由大到小进行排序后再遍历,可以发现当贡献大于0时,该国必然是赢的,当贡献开始小于0
	//此时该国的优势逐渐开始减弱,当累计的优势兵力数(多于其余两国的兵力)小于0时,该国的后续事件都是输或平局,故我们找到优势兵力数小于0的第一个事件,就
	//找到了该国赢的情况下的最大事件个数。
	ll a;
	ll b;
	ll c;
	ll ctb;
	event() { a = 0; b = 0; c = 0; ctb = 0; };
};

//计算魏国赢时的事件贡献,并利用sort排序
bool wei(event& a, event& b) {
	a.ctb = a.a - a.b - a.c; 
	b.ctb = b.a - b.b - b.c;
	if (a.ctb > b.ctb)
		return true;
	else
		return false;
}

//蜀赢
bool shu(event& a, event& b) {
	a.ctb = a.b - a.a - a.c;
	b.ctb = b.b - b.a - b.c;
	if (a.ctb > b.ctb)
		return true;
	else
		return false;
}

//吴赢
bool wu(event& a, event& b) {
	a.ctb = a.c - a.b - a.a;
	b.ctb = b.c - b.b - b.a;
	if (a.ctb > b.ctb)
		return true;
	else
		return false;
}

int main()
{
	int n;
	cin >> n;
	vector<event> events(n);
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < n; j++) {
			ll tmp;
			cin >> tmp;
			if (i == 0)
				events[j].a = tmp;
			else if (i == 1)
				events[j].b = tmp;
			else if (i == 2)
				events[j].c = tmp;
		}
	}

	/*三国各计算一次最大事件数,取其最大值即为答案*/
	//maxwei为魏国赢时的最大事件个数
	int maxwei = 0;
	sort(events.begin(), events.end(), wei);
	ll bingli = 0;
	for (int i = 0; i < n; i++) {
		bingli += events[i].ctb;
		if (bingli < 0) {
			maxwei = i;
			break;
		}
	}

	int maxshu = 0;
	sort(events.begin(), events.end(), shu);
	bingli = 0;
	for (int i = 0; i < n; i++) {
		bingli += events[i].ctb;
		if (bingli < 0) {
			maxshu = i;
			break;
		}
	}

	int maxwu = 0;
	sort(events.begin(), events.end(), wu);
	bingli = 0;
	for (int i = 0; i < n; i++) {
		bingli += events[i].ctb;
		if (bingli < 0) {
			maxwu = i;
			break;
		}
	}

	int res = max(maxwei, maxshu);
	res = max(res, maxwu);
	if (res == 0)
		cout << -1;
	else
		cout << res;
	return 0;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

MilkWay 10月前 回复TA
江东鼠辈哈哈哈