解题思路:
将每个事件中某一个国家的兵力增加量减去其余两国兵力增加量视为事件对该国的贡献,将贡献由大到小排序后遍历,找到第一个该国没赢的状态,此时所经历的事件数-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 人评分
A+B for Input-Output Practice (II) (C语言代码)浏览:622 |
C语言程序设计教程(第三版)课后习题6.2 (C++代码)为什么回车不算字符浏览:1203 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:778 |
C语言训练-阿姆斯特朗数 (C语言代码)浏览:897 |
字符串输入输出函数 (Java代码)浏览:1498 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:573 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:1001 |
1157题解浏览:769 |
简单的a+b (C语言代码)浏览:529 |
C二级辅导-统计字符 (C语言代码)浏览:514 |