Codeforces Round 926(Div.2) A~F

A.Sasha and the Beautiful Array(递推)

题意:

萨沙决定送给女友一个数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,,an。他发现女友会将数组的美丽度评估为所有从 2 2 2 n n n的整数 i i i ( a i − a i − 1 ) (a_i−a_{i−1}) (aiai1)之和。

如果可以重新排列其元素,请帮助他计算数组 a a a的最大美丽度是多少。

分析:

递推可以发现最后的结果为最后一个元素减第一个元素,将其分别取最大和最小,此时的美丽度就是最大值。

代码:

#include<bits/stdc++.h>

using namespace std;
int a[105];

int main() {
   
    int t;
    cin >> t;
    while (t--) {
   
        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        sort(a, a + n);
        cout << a[n - 1] - a[0] << endl;
    }
    return 0;
}

B.Sasha and the Drawing(模拟)

题意:

在幼儿园时,萨沙就喜欢上了一个女孩。他想给她画一幅画,吸引她的注意。

他决定画一个大小为 n × n n\times n n×n的正方形网格,在网格中给一些单元格涂上颜色。但是给单元格上色很困难,所以他想给尽可能少的单元格上色。但与此同时,他希望至少 k k k条对角线上至少有一个着色的单元格。大小为 n × n n\times n n×n的正方形网格共有 4 n − 2 4n-2 4n2条对角线。

计算他需要涂色的最小单元格数。

分析:

模拟一下发现前几次操作可以使答案增加 2 2 2,但是在到达一定的数量后每次只能让答案增加 1 1 1。考虑如何计算出最少涂多少个能把贡献为 2 2 2的格子涂完。画几个图手推一下发现最优方案是先填满第一列,再从最后一列第二行填到倒数第二行,这样前 2 × ( n − 1 ) 2\times(n-1) 2×(n1)次的贡献都是 2 2 2

代码:

#include<bits/stdc++.h>

using namespace std;

int main() {
   
    int t;
    cin >> t;
    while (t--) {
   
        int n, k;
        cin >> n >> k;
        if (k <= (n + n - 2) * 2) {
   
            cout << (k + 1) / 2 << endl;
            continue;
        }
        int ans = 2 * n - 2;
        k -= ans * 2;
        cout << ans + k << endl;
    }
    return 0;
}

C.Sasha and the Casino(递推)

题意:

萨沙决定送给女朋友一个最好的手提包,但不幸的是,这个手提包非常昂贵。因此,萨沙想赚点钱。在网上查看了赚钱技巧后,他决定去赌场。

萨沙知道赌场的运作规则如下。如果萨沙下注 y y y个硬币(其中 y y y为正整数),如果他赢了,他将获得 y ⋅ k y\cdot k yk个硬币(即他的硬币数量将增加 y ⋅ ( k − 1 ) y\cdot(k-1) y(k1))。如果输了,他将输掉全部赌注(即他的硬币数量将减少 y y y)。

注意,投注金额必须始终是一个正整数,并且不能超过萨沙当前的硬币数量。

萨沙还知道赌场有一个保底活动:他不会连续输超过 x x x次。

最初,萨沙有 a a a枚硬币。他想知道自己是否可以下注保证赢取任意数量的硬币。换句话说,对于任意整数 n n n,萨沙可以进行下注,以便在不违反上述规则的情况下,在某一时刻至少拥有n个硬币。

分析:

本题类似倍投法,在一赔一的情况下,第一次压一块钱,每输一次就押注上一次两倍的金额。假如本金无限的话,这种方法赢的期望为无穷大。因为无论输多少次,赢一次本金就增加了 1 1 1

考虑到最坏情况,即第 x + 1 x+1 x+1次才获胜。如果第 x + 1 x+1 x+1次赚钱了,并且投进去的总金额小于等于自己拥有的本金,然后再进行无限多次即可赢取任意数量的钱。所以只需要判断连续输 x x x次是否会输光本金即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;

int main() {
   
    int t;
    cin >> t;
    while (t--) {
   
        int k, x, a;
        cin >> k >> x >> a;
        LL sum = 0;
        bool flag = true;
        for (int i = 1; i <= x + 1; i++) {
   
            LL tmp = (sum + 1 + k - 2) / (k - 1);
            sum += tmp;
            if (sum > a) {
   
                flag = false;
                break;
            }
        }
        if (flag) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

D.Sasha and a Walk in the City(动态规划)

题意:

萨沙想和他的女朋友在城市里散步。城市由 n n n个路口组成,编号从 1 1 1 n n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值