IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> CodeForces Round #821 (div.2) A~C -> 正文阅读

[C++知识库]CodeForces Round #821 (div.2) A~C

A. Consecutive Sum

题意:

给定一个长度为 n 的数组,每次操作选择索引 ij ,满足 i % k == j % k ,并交换 a[i]a[j] ,最多不超过 k 次操作。

操作完后,选择 k 个连续的元素,使得其和最大,输出最大值。

思路:

i % k == j % k 翻译过来就是表示 元素 a[i]a[j] 的距离为 k 。

所以,可以选定前 k 个数,然后以 k 的距离单位去依次遍历数组,选出每个对应位置上的最大元素,相加即为最大值。

代码如下:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 110;

int a[N];

void solve()
{
    memset(a, 0, sizeof(a));

    int n, k;
    cin >> n >> k;

    for (int i = 1; i <= n; i++)
        cin >> a[i];

    ll sum = 0;
    for (int i = 1; i <= k; i++){
        int mx = -1;
        for (int j = i; j <= n; j += k){
            mx = max(mx, a[j]);
        }
        sum += mx;
    }

    cout << sum << endl;
}

int main()
{
    int t;
    cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

B. Rule of League

题意:

有 n 个人在比赛,编号为 1 ~ n 。

规则如下:玩家 1 和玩家 2 打一场比赛,然后获胜者与玩家 3 打一场比赛,然后获胜者与玩家 4 打一场比赛,以此类推。因此,共进行 n - 1 场比赛,最后一场比赛的获胜者成为冠军。

给定一组 n, x, y,每个玩家要么赢 x 场,要么赢 y 场,找到是否有符合条件的结果,输出每场赢的玩家的编号,没有则输出 -1 .

思路:

首先排除掉 x,y 均为 0 的情况,不可能没有人赢。

再看,如果一个人赢了,输了的那个人就一定会被淘汰,所以一定会有人赢 0 场,因此 x, y 中必然有一个为 0 ,另一个不为 0

选出 x, y 中不为 0 的数,将其赋值给 t,赢的玩家都赢 t 次,一共要比赛 n - 1 次,那么 t 一定能被 n - 1 整除。输出时,只需要第一次让玩家 1 赢,赢 t 次后,轮到的下一个人继续赢即可。

代码如下:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 10;

void solve()
{
    int n, x, y;
    cin >> n >> x >> y;

    if (x == 0 && y == 0) puts("-1");

    else if (x && (n - 1) % x == 0 && y == 0 ||
        y && (n - 1) % y == 0 && x == 0)
    {
        int t; //存x或y
        if (x) t = x;
        else t = y;

        for (int i = 1; i <= t; i++)
            cout << 1 << " ";
        for (int i = t + 2; i <= n; i += t)
            for (int j = 1; j <= t; j++)
                cout << i << " ";
        cout << endl;
    }
    
    else puts("-1");
}

int main()
{
    int t;
    cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

C. Parity Shuffle Sorting

题意:

给定一个数组,每次操作选定两个序号 l, r ,若 a[l] + a[r] 是奇数,则 a[r] = a[l] ,若 a[l] + a[r] 是偶数,则 a[l] = a[r] . 要求构造出一个不下降序列,操作次数不超过 n 次,输出 总的操作次数 和每次操作的 两个数的序号

思路:

因为只需要任意一组解,我们可以构造任意一组符合题意的数列。

由于是不下降序列,所以我们可以优先考虑将整个数组都变成一样的数。

先处理首尾元素,只要它们不相等,就将其改变:和为奇数,就都变成 a[1] ;和为偶数,就都变成 a[r] .

再遍历中间元素,将其分别与首尾元素相加,其和为奇数,就变成 a[1] ,其和为偶数,就变成 a[n]

每次操作用 vector<pair<int, int>> 存储,最后输出结果即可。

代码如下:

#include <bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
using namespace std;
const int N = 1e5 + 10;

int a[N];

void solve()
{
    int n;
    cin >> n;

    for (int i = 1; i <= n; i++)
        cin >> a[i];

    vector<PII> ans;
    if(a[1] != a[n]){
        ans.push_back({1, n});
        if ((a[1] + a[n]) % 2) a[n] = a[1];
        else a[1] = a[n];
    }

    for (int i = 2; i < n; i++){
        if ((a[i] + a[1]) % 2){
            a[i] = a[1];
            ans.push_back({1, i});
        }
        else {
            a[i] = a[n];
            ans.push_back({i, n});
        }
    }

    cout << ans.size() << endl;
    for (auto [x,y] : ans)
        cout << x << " " << y << endl;
}

int main()
{
    int t;
    cin >> t;
    while (t--){
        solve();
    }

    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:38:18  更:2022-09-24 20:40:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 6:30:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码