?
2025-08-03 16:01:41
发布于:上海
6阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 生成手枪局位置(1-based)
vector<int> pistol_rounds;
for (int i = 1; i <= n; i++) {
if ((i - 1) % 12 == 0) {
pistol_rounds.push_back(i);
}
}
// 生成处理段:每个段从手枪局开始到下一个手枪局前结束
vector<pair<int, int>> segments;
int m = pistol_rounds.size();
for (int i = 0; i < m; i++) {
int s = pistol_rounds[i];
int e;
if (i + 1 < m) {
e = pistol_rounds[i + 1] - 1;
} else {
e = n;
}
if (s > n) continue;
if (e > n) e = n;
segments.emplace_back(s, e);
}
long long total_contribution = 0;
int current_streak = 0; // 连续失败次数
for (auto &seg : segments) {
int s = seg.first;
int e = seg.second;
if (s > e) continue;
int current_money = 800; // 手枪局开局资金固定为800
for (int i = s; i <= e;) { // i为当前回合(1-based)
// 计算当前回合的最优花费和贡献值
int contrib = 0, cost = 0;
if (current_money >= 2500) {
contrib = 10;
cost = 2500;
} else if (current_money >= 2000) {
contrib = 8;
cost = 2000;
} else if (current_money >= 1500) {
contrib = 5;
cost = 1500;
} else if (current_money >= 600) {
contrib = 1;
cost = 600;
} // 资金不足600时贡献值为0
total_contribution += contrib;
// 计算当前回合的经济奖励
int idx = i - 1; // 转换为0-based索引
int e_reward;
if (a[idx] == 1) { // 胜利
e_reward = 3000;
current_streak = 0; // 胜利重置连败次数
} else { // 失败
if (current_streak == 0) {
e_reward = 1900;
} else if (current_streak == 1) {
e_reward = 2400;
} else { // 连败2次及以上
e_reward = 2900;
}
current_streak++; // 连败次数增加
}
// 更新当前资金
current_money = (current_money - cost) + e_reward;
// 若资金充足且有剩余回合,批量处理剩余回合
if (i < e && current_money >= 2500) {
int remaining = e - i;
total_contribution += remaining * 10; // 每回合贡献值为10
// 更新剩余回合对连败次数的影响
for (int j = i + 1; j <= e; j++) {
int j_idx = j - 1;
if (a[j_idx] == 1) {
current_streak = 0;
} else {
current_streak++;
}
}
break; // 跳出当前段的循环
} else {
i++; // 处理下一个回合
}
}
}
cout << total_contribution << endl;
return 0;
}
这里空空如也

有帮助,赞一个