2024CCPC郑州站超详细题解(含题面)ABFHJLM(河南全国邀请赛)

文章目录

  • 前言
  • A Once In My Life
  • B 扫雷 1
  • F 优秀字符串
  • H 随机栈
  • J 排列与合数
  • L Toxel 与 PCPC II
  • M 有效算法

前言

这是大一博主第一次参加xcpc比赛,虽然只取得了铜牌,但是收获满满,在了解了和别人的差距后会更加激励自己去学习,下面我把我们队会写的题目来给大家讲解,有代码有思路超详细!

A Once In My Life

在这里插入图片描述
这一题是一个构造题,我们需要构造一个幸运数,让这个幸运数是n的倍数。
那么我们先来思考,什么是幸运数?是不是必须包含123456789,还需要至少包含两个d,那么13456789d肯定是一个幸运数。但是这个数字不一定是n的倍数,那么我们如何在不改变12346789d的结构的同时让这个数字变为n的倍数呢?根据观察k和n的范围,我们不难猜想,我们可以再1323456789d后面补上n的长度个0,就比如n是233,那么我们先来一个数字等于123456789d000,补上三位0,此时这个数字仍然不是n的倍数,但是我们让这个数字加上n,再减去这个数字除n的余数,此时这个数字就一定是n的倍数,那么k就等于这个数除n即可得到答案。(减去这个数字除n的余数不会改变前面123456789d这个结构)
代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define for1 for(int i = 1;i <= n;i++)
#define for0 for(int i = 0;i < n;i++) 
#define forn1 for(int j = 1;j <= n;j++) 
#define forn0 for(int j = 0;j < n;j++) 
#define form1 for (int j = 1; j <= m; j++)
#define form0 for (int j = 0; j < m; j++)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define arrn int* arr = new int[n+2];arr[0] = 0,arr[n+1]=0
#define carr cin >> arr[i]
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
int main() {IOS;int _;cin >> _;while (_--){int n;int d;cin >> n >> d;int len = to_string(n).size();long long  luck = 1ll*1234567890 + d;luck *= pow(10, len);luck = luck + n;luck -= luck % n;long long ans = luck / n;cout << ans << endl;}return 0;
}

B 扫雷 1

在这里插入图片描述
这一题是一个贪心题但是不太难,我们贪心的思路就是我们从第一个格子开始走,如果走到的位置的价格是最小的(这里最小的意思是如果继续往后走就再也遇不见这么便宜的价格的意思),那么我们就选择在这里购买。这个是贪心的思路,那么我们怎么判断某个位置的最小值呢?(最小值的意思和刚才一样)?我们可以构建一个dp表dp[i],表示从i出发走到结尾,能遇见的最小值,转移方程为dp[i] = min(dp[i+1],arr[i]);
题解如下:

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define for1 for(int i = 1;i <= n;i++)
#define for0 for(int i = 0;i < n;i++) 
#define forn1 for(int j = 1;j <= n;j++) 
#define forn0 for(int j = 0;j < n;j++) 
#define form1 for (int j = 1; j <= m; j++)
#define form0 for (int j = 0; j < m; j++)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define arrn int* arr = new int[n+2];arr[0] = 0,arr[n+1]=0
#define carr cin >> arr[i]
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
#define mod  1000000007
#define t() int _; cin >> _; while (_--)
int arr[200010];
int dp[200010];
int main() {IOS;int n;cin >> n;for (int i = 1; i <= n; i++){cin >> arr[i];}for (int i = n; i > 0; i--){if (i == n){dp[i] = arr[i];}else{dp[i] = min(dp[i + 1], arr[i]);}}int money = 0;int ans = 0;for (int i = 1; i <= n; i++){money++;if (arr[i] == dp[i] && money >= arr[i]){ans += (money / arr[i]);money %= arr[i];}}cout << ans << endl;return 0;
}

F 优秀字符串

在这里插入图片描述
这一题是一个签到题,全场都通过了。
这题的思路就和题目给你的一样按照题目说的做就行了。
题解如下:

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define for1 for(int i = 1;i <= n;i++)
#define for0 for(int i = 0;i < n;i++) 
#define forn1 for(int j = 1;j <= n;j++) 
#define forn0 for(int j = 0;j < n;j++) 
#define form1 for (int j = 1; j <= m; j++)
#define form0 for (int j = 0; j < m; j++)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define arrn int* arr = new int[n+2];arr[0] = 0,arr[n+1]=0
#define carr cin >> arr[i]
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
#define mod  1000000007
#define t() int _; cin >> _; while (_--)
int main() {IOS;int t;cin >> t;int ans = 0;while (t--){string s;cin >> s;set<char>a;if (s.size() != 5)continue;if (s[2] != s[4])continue;for (int i = 0; i <= 3; i++){a.insert(s[i]);}if (a.size() == 4)ans++;}cout << ans << endl;return 0;
}

H 随机栈

在这里插入图片描述
这题是一道简单的数学题,思路非常简单,我们出栈的时候出去的元素必须是当前栈里面最小的值,比如栈里面有1,2,3我们想让最终序列是非单调递减的话就必须先拿1,我们每次出栈的时候只需要求出取出当前最小值的概率即可,代码实现的话我们是用了一个map<int,int>键值表示入栈的元素,实值表示该元素的个数,入栈的话我们就mp[元素的值]++,出栈的时候就
mp[元素的值]–,mp中的最小值就是mp.begin().first,需要注意的是我们需要一个变量来记录已经出栈的元素中的最大值,如果当前栈的最小的元素要比这个变量的值大,那么我们直接输出0即可,因为已经不可能构造出非递减序列了。

J 排列与合数

在这里插入图片描述
首先经过观察不难发现只要结尾是0或者2或者4或者6或者8的五位数一定是个合数因为他们都是2的倍数,如果这个五位数没有一个数字是02468,那么就输出97531,题目最后的样例给了这是个合数,那么我们的思路就是遍历这5个数字如果某一位的数字是02648之一那么就交换这一位和结尾哪一位,(需要注意如果结尾是0的话就不能交换因为有可能会导致前导0的出现例如21350会变成01352)
题解如下:

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define for1 for(int i = 1;i <= n;i++)
#define for0 for(int i = 0;i < n;i++) 
#define forn1 for(int j = 1;j <= n;j++) 
#define forn0 for(int j = 0;j < n;j++) 
#define form1 for (int j = 1; j <= m; j++)
#define form0 for (int j = 0; j < m; j++)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define arrn int* arr = new int[n+2];arr[0] = 0,arr[n+1]=0
#define carr cin >> arr[i]
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
#define mod  1000000007
#define t() int _; cin >> _; while (_--)
int main() {IOS;int t;cin >> t;while (t--){string s;cin >> s;bool f = false;for (int i = 0; i < 5; i++){if (s[4] == '0')f = true;if ((s[i] == '2' || s[i] == '4' || s[i] == '6' || s[i] == '8' || s[i] == '0')&&s[4]!='0'){f = true;swap(s[i], s[4]);}}if (f)cout << s << endl;else cout << "97531" << endl;}return 0;
}

L Toxel 与 PCPC II

在这里插入图片描述
这一题是一个简单的动态规划题,我们建立dp表dp[i]表示排查到第i个bug时所需的最小时间,我们可以思考第i个bug可以怎么修复,他要么自己单独修复,要么跟着第i-1个一起修复,要么跟着第i-2个一起修复…跟着第1个一起修复,那么我们就可以再来一个循环来判定第i个跟着谁一起修复是最小的。但是这样的话复杂度会变为On方,所以我们要进行优化,根据提议n的范围是2e5,非常小,我们很容易想到如果连续修复太多个bug的话这个数得四次方是远大于从头开始扫描的时间,经过打表观察22的四次方刚好是大于2e5最小整数,所以如果要同时修复的bug大于22时我们肯定是不选的,我们只要求同时修复bug数小于22的,复杂度可以大大降低。我们只需要从max(1,i-22)到 i 这个区间选出最小值。(需要注意的是dp[0]记得开为0,并且需要long long)
题解如下:

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define for1 for(int i = 1;i <= n;i++)
#define for0 for(int i = 0;i < n;i++) 
#define forn1 for(int j = 1;j <= n;j++) 
#define forn0 for(int j = 0;j < n;j++) 
#define form1 for (int j = 1; j <= m; j++)
#define form0 for (int j = 0; j < m; j++)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define arrn int* arr = new int[n+2];arr[0] = 0,arr[n+1]=0
#define carr cin >> arr[i]
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
#define mod  1000000007
#define t() int _; cin >> _; while (_--)
int arr[200010];
vector<long long>dp(200010, LONG_MAX);
int main() {IOS;int n,m;cin >> m >> n;for (int i = 1; i <= n; i++){cin >> arr[i];}dp[0] = 0;dp[1] = 1ll*arr[1] + pow(1, 4);for (int i = 2; i <= n; i++){int j = 1;if (i - j + 1 >= 22)j = i - 21;for(;j<=i;j++)dp[i] = min(dp[j - 1] + arr[i] + (i-j+1)* (i - j + 1)* (i - j + 1)* (i - j + 1),dp[i]);}cout << dp[n] << endl;return 0;
}

M 有效算法

在这里插入图片描述
本题考验二分知识,思路是二分k的取值,就按第一组样例来说当我们k取值为1的时候我们遍历数组想让|8-x|<=k1的话x的取值范围是7-9,想让|3-x|<=k2的话x的取值范围是1-5,两者x的区间不重合,说明肯定没有x能同时让|8-x|<=k1和|3-x|<=k2,所以不成立,当k=2的时候我们发现每一组x的区间都有重合的地方,那么此时a数组一定是可以全都变成x的,并且当k>2时毫无疑问绝对都可以符合,k的取值是否达标具有单调性,所以可以用二分来枚举。
题解如下:

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define for1 for(int i = 1;i <= n;i++)
#define for0 for(int i = 0;i < n;i++) 
#define forn1 for(int j = 1;j <= n;j++) 
#define forn0 for(int j = 0;j < n;j++) 
#define form1 for (int j = 1; j <= m; j++)
#define form0 for (int j = 0; j < m; j++)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define arrn int* arr = new int[n+2];arr[0] = 0,arr[n+1]=0
#define carr cin >> arr[i]
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
#define mod  1000000007
#define t() int _; cin >> _; while (_--)
int a[300010];
int b[300010];
int n;
bool cheak(int k)
{long long ml = a[1] - 1ll * b[1] * k;long long mr = a[1] + 1ll * b[1] * k;for (int i = 2; i <= n; i++){long long ll = a[i] - 1ll * b[i] * k;long long rr = a[i] + 1ll * b[i] * k;if (ll > ml)ml = ll;if (rr < mr)mr = rr;}if (mr < ml)return false;return true;
}
int main() {IOS;int t;cin >> t;while (t--){cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];for(int i = 1; i <= n; i++)cin >> b[i];int l = 0, r = 1e9;while (l <= r){int mid = (l + r) >> 1;if (cheak(mid))r = mid-1;else l = mid+1;}cout << l << endl;}return 0;
}

其余的题目前我还不会,等我补完咯再讲吧,如果觉得博主讲的不错请不要忘记给博主一个免费的关注,点赞,收藏支持一下哦~。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PHP高考志愿填报系统搭建私有化部署源码

金秋志愿高考志愿填报系统是一款为高中毕业生提供志愿填报服务的在线平台。该系统旨在帮助学生更加科学、合理地选择自己的大学专业和学校&#xff0c;从而为未来的职业发展打下坚实的基础。 该系统的主要功能包括:报考信息查询、志愿填报数据指导、专业信息查询、院校信息查询…

面向对象设计之套路——设计模式

1、总则 面向对象的分析设计编程思想&#xff0c;通过封装、继承、多态把程序的耦合度降低&#xff0c;用设计模式使得程序更加灵活&#xff0c;容易修改&#xff0c;并且易于复用。 让业务逻辑与界面逻辑分开&#xff0c;让它们的耦合度下降&#xff0c;只有分离&#xff0c;…

Tableau学习2.0版——复习

官网下载链接&#xff1a;https://www.tableau.com/zh-cn/support/releases 学生账户申请链接&#xff1a;https://www.tableau.com/zh-cn/academic/students。直接去学信网下载学籍在线验证作为申请证明。 目录 1、可视化原理 2、基础图表制作 2.1 对比分析&#xff08;比…

windows打开防火墙指定端口(局域网访问本地项目)

windows打开防火墙指定端口(局域网访问本地项目) 本地运行了Vue前端项目&#xff0c;部署在5173端口&#xff0c;想让同事从局域网内访问项目&#xff0c;开放本机端口5173允许访问 在 Windows 上使用自带的防火墙&#xff0c;你可以按照以下步骤来允许局域网内其他设备对特定端…

视频素材哪里找?7个无版权视频素材网站

这篇文章为那些正在学习视频剪辑的新手提供了一份宝贵的资源清单&#xff0c;介绍了7个可以找到高质量且免费可商用的视频素材网站。每个网站都有其独特的资源库&#xff0c;可以帮助用户找到适合各种项目的视频素材&#xff0c;从生活vlog到专业旅行记录&#xff0c;都可以在这…

48.乐理基础-音符的组合方式-休止符

休止符 音乐中总有一些停顿的地方&#xff0c;一次停顿多久是创作人固定好的&#xff0c;休止符就是用来表示每一次停顿多久 需要停顿的位置就用 0 来表示&#xff0c;数字 0 就是简谱中的休止符 音符有全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等&…

Amesim基础篇-热仿真常用模型库-Electrical Basics/Electric Storage

前言 在动力电池仿真中中我们不免会用到该元件库中的模型&#xff0c;该库中包含基本的电路元件与电池模型。具体的相关模型介绍如下&#xff1a; 1 电压源、电流源、功率源、接地 如图&#xff0c;分别为电压源、电流源和功率源&#xff0c;其中功率源在仿真中经常用到&…

音视频开发3 视频基础,图片基础

1.RGB彩色原理 2.YUV 3.像素&#xff0c;分辨率&#xff0c;位深&#xff0c;帧率&#xff0c;码率&#xff0c;Stride跨距 ◼ 像素 &#xff1a; 像素是一个图片的基本单位&#xff0c; pix 是英语单词 picture的简写&#xff0c;加上英 语单词“元素element”&#xff0c;就…

从Python整数变量内存大小占用28字节谈起

实验结果 本机环境64位Python 3.12 内存布局图 0 4 8 12 16 20 24 28 |----------|----------|----------|----------|----------|----------|----------| | ob_refcnt | ob_type | ob_digit | …

Llama3-Tutorial(Llama 3 超级课堂)-- 笔记

第1节—Llama 3 本地 Web Demo 部署 端口转发 vscode里面设置端口转发 https://a-aide-20240416-b4c2755-160476.intern-ai.org.cn/proxy/8501/ ssh -CNg -L 8501:127.0.0.1:8501 rootssh.intern-ai.org.cn -p 43681参考 https://github.com/SmartFlowAI/Llama3-Tutorial/b…

分享5个免费AI写作软件

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度渗透到我们生活的方方面面&#xff0c;而写作领域也不例外。AI写作工具的出现&#xff0c;不仅改变了传统的写作流程&#xff0c;更在创意表达、文本生成、语言校正等方面展现了其独特的优势。这些工…

Pyhton专题学习资料包,Python从入门到精通全套学习资料[30G]

资源概览 百本Python学习书籍大礼包百本前端学习书籍大礼包微专业-数据挖掘分析之Python篇小甲鱼零基础入门学习Python(全96集) 资源获取 &#x1f9d1;‍&#x1f4bb;【Pyhton专题资料】【30G】 百本Python书籍## 百本前端书籍 微专业-数据挖掘分析之Python篇 预备课【先…

安全测试|常见SQL注入攻击方式、影响及预防

SQL注入 什么是SQL注入&#xff1f; SQL注入是比较常见的网络攻击方式之一&#xff0c;主要攻击对象是数据库&#xff0c;针对程序员编写时的疏忽&#xff0c;通过SQL语句&#xff0c;实现无账号登录&#xff0c;篡改数据库。 SQL注入简单来说就是通过在表单中填写包含SQL关键…

【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架——基本原理和步骤爬取当当网&#xff08;基本步骤&#xff09; 下载scrapy框架创建项目&#xff08;项目文件夹不能使用数字开头&#xff0c;不能包含汉字&#xff09;创建爬虫文件&#xff08;1&#xff09;第一步&#xff1a;先进入到spiders文件中&#x…

缓存菜品操作

一&#xff1a;问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 二&#xff1a;实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; 每个分…

Windows远程桌面实现之十四:实现AirPlay接收端,让苹果设备(iOS,iPad等)屏幕镜像到PC端

by fanxiushu 2024-05-04 转载或引用请注明原始作者。 这个课题已经持续了好几年&#xff0c;已经可以说是很长时间了。 实现的程序是 xdisp_virt&#xff0c; 可以去github下载使用:GitHub - fanxiushu/xdisp_virt: xfsredir file system 一开始是基于测试镜像驱动的目的随便开…

【数据库原理及应用】期末复习汇总高校期末真题试卷05

试卷 一、选择题 1.( )是存储在计算机内有结构的数据的集合。 A.数据库系统 B.数据库 C.数据库管理系统 D.数据结构 2.数据库的三级模式结构中&#xff0c;数据库对象—视图是( ) A.外模式 B.内模式 C.存储模式 D.模式 3.在下列关于关系表的陈述中&#xff0c;错误的是(…

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件&#xff0c;直接打开pom.xml文件&#xff0c;然后添加到maven就行

8种常见的CMD命令

1.怎么打开CMD窗口 步骤1&#xff1a;winr 步骤2&#xff1a;在弹出的窗口输入cmd&#xff0c;然后点击确认&#xff0c;就会出现一个cmd的窗口 2.CMD的8种常见命令 2.1盘符名称冒号 说明&#xff1a;切换盘的路径 打开CMD窗口这里默认的是C盘的Users的27823路径底下&#xf…

容器化Jenkins远程发布java应用(方式一:pipline+ssh)

1.创建pipline工程 2.准备工程Jenkinsfile文件&#xff08;java目录&#xff09; 1.文件脚本内容 env.fileName "planetflix-app.jar" env.configName "planetflix_prod" env.remoteDirectory "/data/project/java" env.sourceFile "/…