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;}
}