Educational Codeforces Round 77 (Rated for Div. 2)
# | 题目 | 分数 | 是否AC |
---|---|---|---|
A | Heating | 1000 | ✅ |
B | Obtain Two Zeroes | 1300 | ✅ |
C | Infinite Fence | 1700 | ❌ |
D | A Game with Traps | 1900 | ❌ |
E | Tournament | 2700 | ❌ |
A. Heating
题目类型 数学
题意
如果一个暖气上有 k k k 个暖气片,则它的花费为 k 2 k^2 k2。现在在一个房间中你可以最多安装 c c c 个暖气,但是房间中至少包含 s u m sum sum 个暖气片,你可以任意设置每个暖气的暖气片的数量。求在满足上述条件的情况下最小花费。
分析
先考虑 c ≥ s u m c \geq sum c≥sum 的情况,此时只需要 s u m sum sum 暖气片为 1 1 1 的暖气即可,总花费就是 s u m sum sum。
而 c < s u m c < sum c<sum 的情况,此时每个暖气暖气片的数量必定 ≥ 1 \geq 1 ≥1,但是想要最小化花费,那么就需要将暖气片的数量尽可能均分到每个暖气上,即 s u m c \frac{sum}{c} csum,但是可能存在有余数的情况,那么把这部分也均分到每一个暖气上,即 ( s u m m o d c ) × ( s u m c + 1 ) 2 + ( s u m − ( s u m m o d c ) ) × ( s u m c ) 2 (sum \mod c) \times (\frac{sum}{c} + 1)^2 + (sum - (sum \mod c)) \times (\frac{sum}{c})^2 (summodc)×(csum+1)2+(sum−(summodc))×(csum)2。
时间复杂度
O ( 1 ) O(1) O(1)
代码
public static void solve() throws IOException {
long c = nextLong();
long sum = nextLong();
if (sum <= c) {
pw.println(sum);
} else {
long x = sum % c;
long re = sum / c;
pw.println(x * (re + 1) * (re + 1) + (c - x) * re * re);
}
}
B. Obtain Two Zeroes
题目类型 数学
题意
输入两个数 a a a、 b b b,每次你可以选择任意正整数 x x x 并执行 a = a − x , b = b − 2 x a=a−x , b=b−2x a=a−x,b=b−2x 或 a = a − 2 x , b = b − x a=a−2x, b=b−x a=a−2x,b=b−x,判断多次操作后是否 a a a 和 b b b 都为 0 0 0。
分析
根据题意可以发现如果最终 a a a 和 b b b 都可以变为 0 0 0,则只需要进行两次操作并得出下式:
{ a − 2 x − y = 0 → y = a − 2 x b − x − 2 y = 0 \begin{cases} a - 2x - y = 0 \rightarrow y = a - 2x \\ b - x - 2y = 0 \\ \end{cases} {a−2x−y=0→y=a−2xb−x−2y=0
代入得
b
−
x
−
2
(
a
−
a
x
)
=
0
b - x - 2(a - ax) = 0
b−x−2(a−ax)=0
b
−
x
−
2
a
+
4
x
=
0
b - x - 2a + 4x = 0
b−x−2a+4x=0
b
−
2
a
=
−
3
x
b - 2a = -3x
b−2a=−3x
这样就可以解出 x x x 和 y y y 的值,然后在将它们代入原式中判断是否满足题意即可。
代码
public static void solve() throws IOException {
long a = nextLong();
long b = nextLong();
long x = (b - 2 * a) / -3;
long y = a - 2 * x;
if (x >= 0 && y >= 0 && a - 2 * x - y == 0 && b - x - 2 * y == 0) pw.println("YES");
else pw.println("NO");
}