AtCoder Beginner Contest 466
链接:https://atcoder.jp/contests/abc466
A - Compromise
涉及知识:无
思路:判断有无非负数即可
Code
点击查看代码
void solve()
{
cin >> n;
vi a(n + 1);
int ok = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (a[i] >= 0)
{
ok = 1;
}
}
if (ok)
{
cout << "No" << endl;
}
else
{
cout << "Yes" << endl;
}
}
B - Representative Balls
涉及知识:无
思路:维护各颜色最大值即可
Code
点击查看代码
void solve()
{
cin >> n >> m;
vi a(m + 1, -1);
for (int i = 1; i <= n; i++)
{
cin >> x >> y;
a[x] = max(a[x], y);
}
for (int i = 1; i <= m; i++)
{
cout << a[i] << ' ';
}
}
C - Count Close Pairs
涉及知识:交互,双指针
思路:利用双指针遍历左指针,同时若满足右指针与左指针距离条件,移动右指针,若无法移动,就移动左指针
Code
点击查看代码
void solve()
{
cin >> n;
int ans = 0;
for (int l = 1; l <= n; l++)
{
if (r < l)
r = l;
while (r + 1 <= n)
{
cout << "? " << l << " " << r + 1 << endl;
cin >> s;
if (s == "Yes")
{
r++;
}
else
{
break;
}
}
ans += (r - l);
}
cout << "! " << ans << endl;
}
D - Placing Rooks
涉及知识:思维
思路:不难发现,每一行每一列最多存在一个棋子,维护这个棋子的位置,如用行数组维护该行棋子位于哪一列,如无棋子,则为 \(0\)。更新的时候先把原来维护的行列维护值设为 \(0\),再更新当前的棋子位置,最后判断所有行棋子的总和即可
Code
点击查看代码
void solve()
{
cin >> n >> m;
vi a(n + 1), b(n + 1);
for (int i = 1; i <= m; i++)
{
cin >> x >> y;
if (a[x] != 0)
{
b[a[x]] = 0;
}
if (b[y] != 0)
{
a[b[y]] = 0;
}
a[x] = y;
b[y] = x;
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] > 0)
ans++;
}
cout << ans << endl;
}
E - Range Flip
涉及知识:dp
思路:手模可知贪心是错误的,所以考虑动态规划,题目中提到可以翻面 \(k\) 次,
转换条件就是有 \(2*k\) 次变换卡面,区间开头一次,结尾一次,若这样考虑,更新状态时,只需要看该卡牌前一张卡牌的状态即可,设 \(dp[i][j][k]\) 代表到第 \(i\) 个卡牌变换了 \(j\) 次卡面,当前卡面状态为 \(k\)。
Code
点击查看代码
void solve()
{
cin >> n >> k;
vi a(n + 1), b(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i] >> b[i];
}
vector<vvi> dp(n + 1, vvi(2 * k + 1, vi(2, inf)));
dp[0][0][0] = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= 2 * k; j++)
{
if (dp[i - 1][j][0] != inf)
dp[i][j][0] = dp[i - 1][j][0] + a[i];
if (dp[i - 1][j][1] != inf)
dp[i][j][1] = dp[i - 1][j][1] + b[i];
if (j > 0)
{
if (dp[i - 1][j - 1][1] != inf)
dp[i][j][0] = max(dp[i - 1][j - 1][1] + a[i], dp[i][j][0]);
if (dp[i - 1][j - 1][0] != inf)
dp[i][j][1] = max(dp[i - 1][j - 1][0] + b[i], dp[i][j][1]);
}
}
}
int ans = 0;
for (int j = 0; j <= 2 * k; j++)
{
ans = max(ans, max(dp[n][j][0], dp[n][j][1]));
}
cout << ans << endl;
}

浙公网安备 33010602011771号