Educational Codeforces Round 167(Div.2) A~D

news2025/2/24 4:20:40

A.Catch the Coin(思维)

题意:

Monocarp 参观了一家有街机柜的复古街机俱乐部。在那里,他对"抓硬币"游戏机产生了好奇。

游戏非常简单。屏幕上的坐标网格是这样的

  • X X X轴从左到右;
  • Y Y Y轴从下往上;
  • 屏幕中心的坐标为 ( 0 , 0 ) (0,0) (0,0)

游戏开始时,角色位于中心位置,屏幕上出现了 n n n枚硬币,其中第 i i i枚硬币的坐标为 ( x i , y i ) (x_i,y_i) (xi,yi)。所有硬币的坐标都不相同,也不等于 ( 0 , 0 ) (0,0) (0,0)

在一秒钟内,可以向八个方向之一移动角色。如果字符位于坐标 ( x , y ) (x,y) (x,y),那么它可能最终到达坐标 ( x , y + 1 ) (x,y+1) (x,y+1) ( x + 1 , y + 1 ) (x+1,y+1) (x+1,y+1) ( x + 1 , y ) (x+1,y) (x+1,y) ( x + 1 , y − 1 ) (x+1,y-1) (x+1,y1) ( x , y − 1 ) (x,y-1) (x,y1) ( x − 1 , y − 1 ) (x-1,y-1) (x1,y1) ( x − 1 , y ) (x-1,y) (x1,y) ( x − 1 , y + 1 ) (x-1,y+1) (x1,y+1)中的任意一个。

如果角色最终在坐标处获得了一枚硬币,那么Monocarp就会收集这枚硬币。

在Monocarp移动之后,所有硬币都会下降 1 1 1,即从 ( x , y ) (x,y) (x,y)移动到 ( x , y − 1 ) (x,y-1) (x,y1)。我们可以假设游戏场地在所有方向上都是无限的。

Monocarp想要收集至少一枚硬币,但却无法决定收集哪枚硬币。请帮助他确定能否收集到每一枚硬币。

分析:

设一个硬币与原点的 x x x轴方向距离为 d d d。最优思路肯定是在开局的 d d d秒内走到与硬币 x x x坐标相同、 y y y坐标为 − d -d d的位置。如果此时硬币已经掉到这个位置下方那就收集不到了,否则就肯定可以接到。

代码:

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n, x, y;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> x >> y;
        int dist = (x == 0 ? 0 : abs(x));
        int yy = -dist;
        if (y - dist >= yy - 1)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

B.Substring and Subsequence(贪心)

题意:

给你两个字符串 a a a b b b,这两个字符串都由小写拉丁字母组成。

字符串的子串是从原始字符串中删除几个(可能是零)字符后得到的字符串。字符串的子串是该字符串的连续子串。

例如,考虑字符串 a b a c abac abac

  • a 、 b 、 c 、 a b 、 a a 、 a c 、 b a 、 b c 、 a b a 、 a b c 、 a a c 、 b a c a、b、c、ab、aa、ac、ba、bc、aba、abc、aac、bac abcabaaacbabcabaabcaacbac a b a c abac abac是其子序列;
  • a 、 b 、 c 、 a b 、 b a 、 a c 、 a b a 、 b a c a、b、c、ab、ba、ac、aba、bac abcabbaacababac a b a c abac abac是它的子串。

你的任务是计算包含 a a a作为子串和 b b b作为子序列的字符串的最小可能长度。

分析:

考虑贪心,答案一定包含这两个字符串并加上一些字符,为使答案最短,要让添加的字符最少,即让 a a a b b b的公共子序列尽可能长,所以答案即为两个字符串长度之和减去最长公共子序列的长度。

观察数据范围较小,暴力寻找最长公共子序列,每次从 b b b的的一个字符开始向后与 a a a匹配, s u m sum sum记录当前区间的最长公共子序列, s s s记录 a a a b b b的最长公共子序列。

代码:

#include<bits/stdc++.h>

using namespace std;

void solve() {
    string a, b;
    cin >> a >> b;
    int n = a.size();
    int m = b.size();
    int s = 0;
    for (int i = 0, sum = 0; i < m; i++, s = max(s, sum), sum = 0)
        for (int j = 0, t = i; j < n; j++)
            if (a[j] == b[t]) {
                t++;
                sum++;
            }
    cout << n + m - s << endl;
}

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

C.Two Movies(贪心)

题意:

某电影公司发行了 2 2 2部电影。有 n n n人观看了这 2 2 2部电影。我们知道每个人对第一部电影的态度(喜欢、中立或不喜欢)以及对第二部电影的态度。

如果要求某人为电影留下评论,那么

  • 如果这个人喜欢这部电影,他就会留下好评,这部电影的评分就会增加 1 1 1
  • 如果此人不喜欢这部电影,则会留下差评,电影评分将降低 1 1 1
  • 否则,他们会留下中评,电影评分不会改变。

每个人都会评论一部电影,您可以为每个人选择评论哪部电影。

公司的评分是两部电影评分的最小值。您的任务是计算公司可能获得的最高评分。

分析:

本题我们采用贪心的思路,如果某人对两部电影评分不一样,显然取评分高的那一个。即如果是 1 1 1 0 0 0 1 1 1 − 1 −1 1,那么显然取 1 1 1。如果是 0 0 0 − 1 −1 1,显然取 0 0 0

下面讨论评分一样的情况。对于 0 0 0 0 0 0,取哪一个都没有影响,直接忽略。对于 1 1 1 1 1 1,我们记录这种人的个数,在处理完评分不一样的人之后统一处理。由于我们要使最小值最大,所以优先将这种人的增加评分给较小的一部电影。否则不会影响最小值,显然不是最优方法。对于 − 1 −1 1 − 1 −1 1,同理,我们记录这种人的个数,在处理完评分不一样的人之后统一处理。由于我们要使最小值最大,所以优先将这种人的减少评分给较大的一部电影。否则会减小最小值,不是最优情况。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int MOD = 998244353;
LL n, a[300000], b[300000];

void solve() {
    LL x = 0, y = 0, cnt1 = 0, cnt2 = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        cin >> b[i];
    for (int i = 1; i <= n; i++) {
        if (a[i] > b[i])
            x += a[i];
        else if (a[i] < b[i])
            y += b[i];
        else if (a[i] == 1 && b[i] == 1)
            cnt1++;
        else if (a[i] == -1 && b[i] == -1)
            cnt2++;
    }
    while (cnt1) {
        if (x <= y)
            x++;
        else
            y++;
        cnt1--;
    }
    while (cnt2) {
        if (x >= y)
            x--;
        else
            y--;
        cnt2--;
    }
    cout << min(x, y) << endl;
}

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

D.Smithing Skil(贪心、动态规划)

题意:

您正在玩一款著名的电脑游戏,在这款游戏中,您可以提升各种技能的等级。今天,你的重点是 "铸造"技能。你的战术显而易见:用金属锭锻造武器,然后将其熔化,部分返回材料。简单来说,每制造一件物品,你就能获得 1 1 1点经验值,而每熔化一件物品,你也能获得 1 1 1点经验值。

可以锻造的武器有 n n n种,金属锭有 m m m种。

花费 a i a_i ai个同类金属锭,你就可以打造一把 i i i类的武器。熔化一件(你之前制作过的) i i i阶级的武器会为你带来 b i b_i bi块与之相同类型的金属锭。

你有 c j c_j cj j j j类型的金属锭,而且你知道你可以用任何金属类型制作任何类型的武器。武器等级和金属类型的每种组合都可以使用任意次数。

制作和熔炼武器最多可以获得多少经验值?

分析:

观察题目发现要对每种金属求出最多能获得的经验数,然后相加。此外,一种装备锻造了之后一定会将其融化掉,因为熔掉获得材料和经验。我们注意到 a i − b i a_i−b_i aibi最小的装备是贡献最高的,因为消耗材料最少。在所有贡献最高的装备里面我们可以随便选取一种出来针对同一种金属不停地锻造再熔掉,直到因为剩余金属量 < a i <a_i <ai而不能锻造为止。

观察数据范围发现 a i ≤ 1 0 6 a_i≤10^6 ai106,当某种金属剩余量为 x x x时,我们的最优方案是在所有 a i ≤ x a_i≤x aix的装备中选贡献最高的锻造。因此我们可以对所有 ≤ 1 0 6 ≤10^6 106的金属剩余量用一个简单的 d p dp dp预处理出这个剩余量所能挣到的经验。对于较大的剩余量 c k ( k ∈ [ 1 , m ] ) c_k(k∈[1,m]) ck(k[1,m]),先用贡献最高的装备把剩余量消耗到 1 0 6 10^6 106以下,然后调用预处理的值即可。

代码:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 1000010;
const int MOD = 998244353;

void sol(LL &a, LL b) {
    if (a > b)
        a = b;
}

LL n, m, a[N], b[N], c[N], add[N], dp[N];

int main() {
    ios::sync_with_stdio(false);
    for (int i = 0; i < N; i++) add[i] = 1e18;
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < n; i++) {
        cin >> b[i];
        b[i] = a[i] - b[i];
        sol(add[a[i]], b[i]);
    }
    for (int i = 0; i < m; i++) cin >> c[i];
    LL mn = 1e18;
    for (LL i = 1; i <= 1000003; ++i) {
        sol(mn, add[i]);
        if (mn <= i) dp[i] = dp[i - mn] + 1;
    }
    pair<LL, LL> opt = make_pair(1e18, 1e18);
    for (int i = 0; i < n; i++) opt = min(opt, make_pair(b[i], a[i]));
    LL ans = 0;
    for (int i = 0; i < m; i++) {
        if (c[i] >= opt.second) {
            ans += (c[i] - opt.second + opt.first - 1) / opt.first;
            c[i] -= (c[i] - opt.second + opt.first - 1) / opt.first * opt.first;
        }
        ans += dp[c[i]];
    }
    cout << ans * 2 << endl;
    return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web缓存代理服务器

一、web缓存代理 web代理的工作机制 代理服务器是一个位于客户端和原始&#xff08;资源&#xff09;服务器之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理服务器发送一个请求&#xff0c;并指定目标原始服务器&#xff0c;然后代理服务器向原始…

Python基础小知识问答系列-自定义反向迭代器

1. 问题&#xff1a; 现在想要一个具有反向迭代的迭代器&#xff0c;该怎样实现反向迭代的能力&#xff1f; 2. 解决方法&#xff1a; 首先&#xff0c;在自定义一个迭代器&#xff0c;在类中实现__reversed__方法&#xff1b;使用内置函数reversed实现反 向迭代。 示例&…

linux 下,Java由Java8升级到Java11,Java不更新版本号

在ES对接过程&#xff0c;springboot3进行对接&#xff0c;需要将Java升级到11版本。首先下载安装选好的11版本Java&#xff0c;在linux下解压后&#xff0c;配置/etc/profile export JAVA_HOME/root/SJL/jdk-11.0.22 然后保存&#xff0c;执行文件source /etc/profile&#…

【算法笔记自学】第 5 章 入门篇(3)——数学问题

5.1简单数学 #include <cstdio> #include <algorithm> using namespace std; bool cmp(int a,int b){return a>b; } void to_array(int n,int num[]){for(int i0;i<4;i){num[i]n%10;n /10;} } int to_number(int num[]){int sum0;for(int i0;i<4;i){sumsu…

BitWidget,自定义bit控件

由于QBitArray并不满足我做界面是的需求&#xff0c;所以参照QBitArray简单的写了个控件&#xff0c;如下所示&#xff0c;源码及实例在我上传的资源包中 实例 帮助文档如图所示&#xff08;部分&#xff09; 帮助文档&#xff08;在资源包中&#xff09; 1.html文档 2.chm文…

使用Python绘制和弦图

使用Python绘制和弦图 和弦图效果代码 和弦图 和弦图用于展示数据的多对多关系&#xff0c;适合用于社交网络、交通流量等领域的分析。 效果 代码 import pandas as pd import holoviews as hv from holoviews import opts hv.extension(bokeh)# 示例数据 data [(A, B, 2),…

Java对象通用比对工具

目录 背景 思路 实现 背景 前段时间的任务中&#xff0c;遇到了需要识别两个对象不同属性的场景&#xff0c;如果使用传统的一个个属性比对equals方法&#xff0c;会存在大量的重复工作&#xff0c;而且为对象新增了属性后&#xff0c;比对方法也需要同步修改&#xff0c;不方…

JUC(java.util.concurrent)中的常见类

文章目录 Callable接口ReentrantLockReentrantLock 和 synchronized 的区别:如何选择使用哪个锁? 信号量SemaphoreCountDownLatch多线程环境使用ArrayList多线程使用 哈希表相关面试题 JUC放了和多线程有关的组件 Callable接口 和Runnable一样是描述一个任务,但是有返回值,表…

查询某个县区数据,没有的数据用0补充。

加油&#xff0c;新时代打工人&#xff01; 思路&#xff1a; 先查出有数据的县区&#xff0c;用县区编码判断&#xff0c;不存在县区里的数据。然后&#xff0c;用union all进行两个SQL拼接起来。 SELECTt.regionCode,t.regionName,t.testNum,t.sampleNum,t.squareNum,t.crop…

springboot+vue+mybatis图书馆借阅管理系统+PPT+论文+讲解+售后

21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存储达到…

三分钟内了解卷轴模式

在数字化时代的浪潮中&#xff0c;卷轴商业模式巧妙地将积分体系、互动任务、社交裂变、虚拟经济体系以及个性化成长路径等多元要素融为一体。 积分体系&#xff1a;激发参与动力的源泉 卷轴商业模式的核心在于其精心构建的积分系统。新用户踏入平台&#xff0c;即获赠一笔启…

基于自编码器的时间序列异常检测方法(以传感器数据为例,MATLAB R2021b)

尽管近年来研究者对自编码器及其改进算法进行了深入研究&#xff0c;但现阶段仍存在以下问题亟须解决。 1) 无监督学习模式对特征提取能力的限制与有监督学习相比&#xff0c;无监督学习模式摆脱了对样本标签的依赖、避免了人工标注的困难&#xff0c;但也因此失去了样本标签的…

LLM - 循环神经网络(RNN)

1. RNN的关键点&#xff1a;即在处理序列数据时会有顺序的记忆。比如&#xff0c;RNN在处理一个字符串时&#xff0c;在对字母表顺序有记忆的前提下&#xff0c;处理这个字符串会更容易。就像人一样&#xff0c;读取下面第一个字符串会更容易&#xff0c;因为人对字母出现的顺序…

一站式解决方案:用ChatGPT和AutoGPT组建你的个人写作团队

ChatGPT 在 AI 内容创作领域带来了巨大的飞跃&#xff0c;然而它在撰写完整文章时偶尔会陷入废话和奇怪主题。作为专业作家、AI专家及OpenAI Beta测试人员&#xff0c;我一直探索AI写作。虽然ChatGPT表现出色&#xff0c;但有时难以达到创造高质量文章的标准。 最近&#xff0…

EtherCAT转Profinet网关配置说明第二讲:上位机软件配置

EtherCAT协议转Profinet协议网关模块&#xff08;XD-ECPNS20&#xff09;&#xff0c;不仅可以实现数据之间的通信&#xff0c;还可以实现不同系统之间的数据共享。EtherCAT协议转Profinet协议网关模块&#xff08;XD-ECPNS20&#xff09;具有高速传输的特点&#xff0c;因此通…

githup开了代理push不上去

你们好&#xff0c;我是金金金。 场景 git push出错 解决 cmd查看 git config --global http.proxy git config --global https.proxy 如果什么都没有&#xff0c;代表没设置全局代理&#xff0c;此时如果你开了代理&#xff0c;则执行如下&#xff0c;设置代理 git con…

Github:git提交代码到github

创建 GitHub 仓库 a. 登录到您的 GitHub 账户。 b. 点击右上角的 "" 图标&#xff0c;选择 "New repository"。 c. 填写仓库名称&#xff08;例如 "Mitemer"&#xff09;。 d. 添加项目描述&#xff08;可选&#xff09;。 e. 选择仓库为 &…

微信小程序的轻松音乐-计算机毕业设计源码48092

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 基于微信小程序的轻松音乐系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.3 系统用例分析 2.4 系统…

排序——数据结构与算法 总结8

目录 8.1 排序相关概念 8.2 插入排序 8.2.1 直接插入排序&#xff1a; 8.2.2 折半插入排序&#xff1a; 8.2.3 希尔排序&#xff1a; 8.3 交换排序 8.3.1 冒泡排序&#xff1a; 8.3.2 快速排序&#xff1a; 8.4 选择排序 8.4.1 简单选择排序 8.4.2 堆排序 8.5 归并…

C++--partition库函数

介绍 在C中&#xff0c;partition函数通常是指STL&#xff08;Standard Template Library&#xff09;中的std::partition算法&#xff0c;它用于对一个序列进行分区操作。具体来说&#xff0c;std::partition接受一个范围和一个谓词&#xff08;predicate&#xff09;作为参数…