当前位置:首页 > 技术 > 正文内容

Codeforces Round 908 (Div. 2) 解题报告

访客 技术 2026年7月4日 1

T1 题目解析

A/B双人竞技赛规则:每轮需先赢得X局者胜,整个比赛需先赢得Y局者胜。已知总比赛局数n(1≤n≤20)及各局胜负记录,判定最终胜者。

关键观察:最终决胜局的胜利者即为整体胜者。由于比赛会在决出胜负时终止,故只需取最后一局结果。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int testCases;
    cin >> testCases;
    while (testCases--) {
        int roundCount;
        string resultSequence;
        cin >> roundCount >> resultSequence;
        cout << resultSequence[roundCount-1] << endl;
    }
    return 0;
}

T2 题目解析

给定数组a,构造数组b(元素值仅限1/2/3),需满足以下三个条件中的恰好两个:

  1. 存在i,j使a[i]=a[j]且b[i]=1,b[j]=2
  2. 存在i,j使a[i]=a[j]且b[i]=1,b[j]=3
  3. 存在i,j使a[i]=a[j]且b[i]=2,b[j]=3

解法策略:对重复元素采用差异化赋值。统计每个数值出现次数,优先为高频元素分配不同值。当重复元素数量不足时返回-1。

#include <bits/stdc++.h>
using namespace std;
const int MAX_SIZE = 105;
int inputArray[MAX_SIZE], outputArray[MAX_SIZE];

int main() {
    int testCases;
    cin >> testCases;
    while (testCases--) {
        int arraySize;
        cin >> arraySize;
        memset(outputArray, 0, sizeof(outputArray));
        for (int i=1; i<=arraySize; ++i) {
            cin >> inputArray[i];
            outputArray[inputArray[i]]++;
        }
        int duplicateGroups = 0;
        for (int i=1; i<=100; ++i) {
            if (outputArray[i] > 1) duplicateGroups++;
        }
        if (duplicateGroups < 2) {
            cout << "-1\n";
            continue;
        }
        int valueCounter = 2;
        for (int i=1; i<=arraySize; ++i) {
            if (outputArray[inputArray[i]] > 1 && valueCounter < 4) {
                cout << valueCounter << " ";
                valueCounter++;
                outputArray[inputArray[i]] = 0;
            } else {
                cout << "1 ";
            }
        }
        cout << "\n";
    }
    return 0;
}

T3 题目解析

给定初始序列a和目标序列b,判断是否存在经过k次合法操作后能转化为b。每次操作需选择满足a[x]=x的元素,执行x次循环移位。

核心发现:每次操作后a[n]的位置值会保持稳定。通过逆向推导,每次移动量等于当前a[n]的值。当移动量超过序列长度时判定不可行。

#include <bits/stdc++.h>
using namespace std;
const int MAX_LEN = 2e5 + 5;
int sequence[MAX_LEN];

int main() {
    int testCases;
    cin >> testCases;
    while (testCases--) {
        int length, operationCount;
        cin >> length >> operationCount;
        for (int i=1; i<=length; ++i) cin >> sequence[i];
        if (operationCount > length) operationCount = length;
        int shiftAmount = 0;
        bool isValid = true;
        for (int step=1; step<=operationCount; ++step) {
            if (sequence[length - shiftAmount] > length) {
                isValid = false;
                break;
            }
            shiftAmount += sequence[length - shiftAmount];
            if (shiftAmount >= length) shiftAmount -= length;
        }
        cout << (isValid ? "Yes" : "No") << "\n";
    }
    return 0;
}

T4 题目解析

给定两个序列a和b,构造新序列c使得最长递增子序列长度最短。a序列顺序固定,b序列元素可任意插入位置。

最优策略:将b排序后按升序插入a中。这样保证新增元素不会破坏原有LIS结构,最终LIS长度等于原a序列的LIS长度。

#include <bits/stdc++.h>
using namespace std;
const int MAX_LEN = 2e5 + 5;
int main() {
    int testCases;
    cin >> testCases;
    while (testCases--) {
        int aSize, bSize;
        cin >> aSize >> bSize;
        // 实现逻辑略
    }
    return 0;
}

T5 题目解析

定义多重集合的不优美度为元素值等于集合长度的出现次数。给定m个多重集合,每个集合包含若干不同元素的多个副本。需选择每个集合选取的元素数量区间[l_i, r_i],使最终合并集合的不优美度最小。

关键点:对于每个集合,优先选取较小的元素值,以减少与集合长度相等的元素数量。通过贪心策略选择最优的元素组合。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。