Educational Codeforces Round 77 (Rated for Div. 2)

Educational Codeforces Round 77 (Rated for Div. 2)

原题地址

#题目分数是否AC
AHeating1000
BObtain Two Zeroes1300
CInfinite Fence1700
DA Game with Traps1900
ETournament2700





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 csum 的情况,此时只需要 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=ax,b=b2x a = a − 2 x , b = b − x a=a−2x, b=b−x a=a2x,b=bx,判断多次操作后是否 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} {a2xy=0y=a2xbx2y=0


代入得


     b − x − 2 ( a − a x ) = 0 b - x - 2(a - ax) = 0 bx2(aax)=0
     b − x − 2 a + 4 x = 0 b - x - 2a + 4x = 0 bx2a+4x=0
     b − 2 a = − 3 x b - 2a = -3x b2a=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");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值