阿符长命十万岁


私信TA

用户名:uq_31660518827

访问量:1309

签 名:

等  级
排  名 1797
经  验 2546
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

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

4 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

江东鼠辈哈哈哈
2024-03-13 20:19:12
  • «
  • 1
  • »