Codeforces Round 926(Div.2) A~F

A.Sasha and the Beautiful Array(递推)

题意:

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

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

分析:

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

代码:

#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×nn\times nn×n的正方形网格,在网格中给一些单元格涂上颜色。但是给单元格上色很困难,所以他想给尽可能少的单元格上色。但与此同时,他希望至少kkk条对角线上至少有一个着色的单元格。大小为n×nn\times nn×n的正方形网格共有4n−24n-24n2条对角线。

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

分析:

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

代码:

#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(递推)

题意:

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

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

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

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

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

分析:

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

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

代码:

#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(动态规划)

题意:

萨沙想和他的女朋友在城市里散步。城市由nnn个路口组成,编号从111nnn。其中一些路口由道路连接,从任何一个路口出发,都有一条简单的路径†^{\dagger}

### Codeforces Round 1005 Div. 2 A-F Problem Solutions #### A. Money Change 为了处理货币转换问题,可以将所有的金额都转化为分的形式来简化计算。通过遍历输入数据并累加各个部分的金额,最后求得剩余的钱数并对100取模得到最终结果[^2]。 ```cpp #include <iostream> using namespace std; int main() { int s, xi, yi; cin >> s; int total_cents = 0; for (int i = 0; i < s; ++i) { cin >> xi >> yi; total_cents += xi * 100 + yi; } cout << (s * 100 - total_cents) % 100 << endl; } ``` #### B. Odd and Even Pairs 此题目要求找到至少一对满足条件的索引:要么是一个偶数值的位置,或者是两个奇数值位置。程序会读入测试次数`t`以及每次测试中的数组长度`n`及其元素,并尝试找出符合条件的一对索引输出;如果没有这样的组合则返回-1[^3]。 ```cpp #include <cstdio> int main() { int t, n, num; scanf("%d", &t); while (t--) { int evenIndex = 0, oddIndex1 = 0, oddIndex2 = 0; scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &num); if (num % 2 == 0 && !evenIndex) evenIndex = i; else if (num % 2 != 0) { if (!oddIndex1) oddIndex1 = i; else if (!oddIndex2) oddIndex2 = i; } if ((evenIndex || (oddIndex1 && oddIndex2))) break; } if (evenIndex) printf("1\n%d\n", evenIndex); else if (oddIndex1 && oddIndex2) printf("2\n%d %d\n", oddIndex1, oddIndex2); else printf("-1\n"); } return 0; } ``` 由于仅提供了前两道题的具体描述和解决方案,在这里无法继续给出完整的C至F题解答。通常情况下,每一道竞赛编程题都有其独特的挑战性和解决方法,建议查阅官方题解或社区讨论获取更多帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值