Atcoder Beginner ABC166 F
Posted rex-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Atcoder Beginner ABC166 F相关的知识,希望对你有一定的参考价值。
Atcoder ABC166 F
Three Variables Game
题意
有一个游戏包含三个变量,分别表示为(A),(B)和(C)。随着游戏的进行,将会有(N)个事件要求您做出选择。这些选项中的每一个都由一个字符串Si?表示。如果Si是(A) || (B),你必须在(A)或(B)上加(1),然后从另一个上减去1;如果Si是(A)|| (C),你必须在(A)或(C)上加1,然后从另一个上减去1;如果Si是(B) || (C) ,你必须在(B)或(C)上加1,然后从上减去1。每次选择后,(A)、(B)和(C)都不应为负。确定在这种情况下是否可以做出(N)个选择。如果可能的话,也给一个这样的方式来做选择。
输入
(N) (A) (B) (C)
S1 S2
:
SN
输出
输出如果在这种情况下可以做出(N)个选择,则打印“是”;否则,打印“否”。
另外,在前一种情况下,展示一种这样的方法来在随后的N行中进行选择。第((i)+1)行应该包含变量((A)、(B)或(C))的名称,您在第(i)-(th)选项中向其添加1。
标准答案
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, a[3];
cin >> n >> a[0] >> a[1] >> a[2];
vector<string> q(n);
for (auto &e : q)
cin >> e;
vector<char> result;
for (int i = 0; i < n; ++i)
{
string s = q[i];
int x = s[0] - ‘A‘;
int y = s[1] - ‘A‘;
if (!a[x] && !a[y])
{
result.clear();
break;
}
if (a[x] > a[y])
{
--a[x];
++a[y];
result.push_back(s[1]);
continue;
}
if (a[x] < a[y])
{
++a[x];
--a[y];
result.push_back(s[0]);
continue;
}
if (i + 1 < n && q[i + 1].find(s[0]) != string::npos)
{
++a[x];
--a[y];
result.push_back(s[0]);
continue;
}
--a[x];
++a[y];
result.push_back(s[1]);
}
if (result.empty())
{
cout << "No
";
return 0;
}
cout << "Yes
";
for (char c : result)
cout << c << ‘
‘;
}
以上是关于Atcoder Beginner ABC166 F的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 166 题解报告
解题报告AtCoder Beginner Contest 166
解题报告AtCoder Beginner Contest 166
AtCoder Beginner Contest 153 F - Silver Fox vs Monster