AtCoder Beginner Contest 053
A
int N; std::cin >> N;
std::cout << (N < 1200 ? "ABC" : "ARC") << "\n";
B
题意:
史努克打算从 \(s\) 中拿出一个子串,满足 \(A\) 开头 \(Z\) 结尾。
给出 \(s\) ,询问最长满足条件子串。保证子串存在。
\(2 \leq |s| \leq 2 \times 10^{5}\)
题解:
双指针?上当了……
答案是第一个 \(A\) 和最后一个 \(Z\) ,\(pos_Z - pos_A + 1\) 。
std::string s; std::cin >> s;
int r = s.size() - 1, l = 0;
while (l < s.size() && s[l] != 'A') l++;
while (r >= 0 && s[r] != 'Z') --r;
std::cout << r - l + 1 << "\n";
C
题意:
原题面说了一大堆。大意是一个骰子六个面是 \(1 \sim 6\) ,且对立的面之和为 \(7\) 。
你可以将任意面初始朝上,然后任意角度翻转骰子 \(90\) 度(翻转后骰子要正放)。
给一个正整数 \(x\) ,询问至少需要翻转多少次,能够使得骰子上面出现的数字之和 \(\geq x\) 。
题解:
\(6\) 和 \(5\) 一定不对立,于是一定相邻。
\(\lfloor \frac{x}{11} \rfloor\) 的一定可以被 \(6\) \(5\) 反复切换贡献,次数为 \(2 \lfloor \frac{x}{1} \rfloor\) 。
实际上进行完这部操作后,可以任选下一次朝上的面是 \(6\) 还是 \(5\) ,显然应该是 \(6\) 。
若 \(x \bmod 11 = 0\) ,则次数不变。
若 \(1 \leq x \bmod 11 \leq 6\) ,则次数加一。
若 \(6 < x \bmod < 11\) ,则次数加二。
D
题意:
有一叠牌,你需要经过下述操作任意此(可以是 \(0\) 次),使剩下的牌两两不同,且剩下的牌最多。
操作:任选三张牌,吃掉最大和最小的,剩下的牌还回牌堆。
题解:
只看答案,考虑一定需要丢弃的牌:每种牌只留下一张,其他牌全丢弃。共有 $tot = \sum_{i = 1}^{N} a_i - 1 $ 张。
如果 \(tot \% 2 = 0\) ,选出 \(2\) 张弃牌和某 \(1\) 张保留牌。总能丢掉两张不需要的牌。
如果 \(tot \% 2 = 1\) ,最后会剩下 \(1\) 张需要丢弃的牌,此时丢掉这张弃牌的基础上,至少且可以需要丢掉另一张牌。比如选出 \(2\) 张重复牌和另 \(1\) 张保留牌。
最终能剩下的最多的互不相同的牌有 $n - \lceil \frac{tot}{2} \rceil \times 2 $ 张。
浙公网安备 33010602011771号