cf1553C. Penalty
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf1553C. Penalty相关的知识,希望对你有一定的参考价值。
题意:
有十轮点球,两个队伍轮流进行,1表示进,0表示不进,?表示未知,如果比赛没有了悬念将直接结束。现在让你预测一个情况,使得进行的轮数最少。裁判在决定停止点球阶段时没有考虑任何预测-你可能知道一些点球将会/不会得分,但裁判没有。
题解:
当时我第一反应,最佳情况就是一方的?全是进球,另一方?全没进球,为什么这样,因为要求比赛尽快结束,为了让比赛没有悬念,我们就要尽可能拉大比分,已有的0和1已经确定了进球情况,而?还是未知,所以我们将两侧?取相反,这样就保证极端情况
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
string s;
cin >> s;
int ans = 9;
int cnt0 = 0, cnt1 = 0;
for (int i = 0; i < 10; ++i) {
if (i % 2 == 0) cnt0 += s[i] != '0';
else cnt1 += s[i] == '1';
/*
(10 - i) / 2表示如果第二个队后面的点球全进
(9 - i ) / 2表示如果第一个队后面的点球全进
*/
if (cnt0 > cnt1 + (10 - i) / 2) ans = min(ans, i);
if (cnt1 > cnt0 + (9 - i) / 2) ans = min(ans, i);
}
cnt0 = 0, cnt1 = 0;
for (int i = 0; i < 10; ++i) {
if (i % 2 == 0) cnt0 += s[i] == '1';
else cnt1 += s[i] != '0';
if (cnt0 > cnt1 + (10 - i) / 2) ans = min(ans, i);
if (cnt1 > cnt0 + (9 - i) / 2) ans = min(ans, i);
}
cout << ans + 1 << endl;
}
}
以上是关于cf1553C. Penalty的主要内容,如果未能解决你的问题,请参考以下文章
CF&&CC百套计划2 CodeChef December Challenge 2017 Penalty Shoot-out