CSDN竞赛24期题解
admin
2024-05-14 21:22:54
0

总结

本次竞赛的主要考点在于模拟,而且需要考虑的情况还蛮多,平时复杂点的模拟很少做,这次AC也花了挺长时间,后面还是需要夯实一下基础啊。

题目列表

1.计数问题

题目描述

试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9) 共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。

输入描述:

2 个整数 n,x ,之间用一个空格隔开。

输出描述:

1 个整数,表示 x 出现的次数。

输入样例:

11 1

输出样例:

4

分析

理论上这题应该使用数位DP求解,考虑到是T1,暴力枚举足以解决。枚举下1到n的所有整数,分离出每一位,统计下出现x的次数即可。

代码

#include 
#include 
#include 
#include 
using namespace std;
int n,x;
int get(int t) {int q;int res = 0;while(t) {q = t % 10;if (q == x) res++;t /= 10;}return res;
}
int main() {cin>>n>>x;long long res = 0;for (int i = 1; i <= n; i++) {res += get(i);}cout<

2.小艺的英文名

题目描述

小艺酱想给自己起一个英文名字。
小艺酱想要装的自己学识渊博。
所以她想要自己英文名字必须满足:
1.只有字母表中前k个小写字母。
2.必须是回文串。
3.前k个小写字母每个字母至少出现一次。
小艺酱已经自己完成了部分空余的字母部分用’?’代替。
请你帮她完成她的英文名字。

输入描述:

第一行输入一个整数k。(1<=k<=26)
第二行输入小艺酱的英文名字name。(1<=strlen(name)<=1000)

输出描述:

如果小艺的名字不存在输出“QAQ”,
如果存在多组解,输出字典序最小的一个解。

输入样例:

2
a??a

输出样例:

abba

分析

本题乍一看挺难的,其实就是模拟题。

首先判断下有没有解,如果回文串中对应的两个字符不含?且不相等,说明解不存在。

如果其中的一方存在?,就用对应的字符替换它。

我们再来统计下剩下的?个数,由于是回文串,只需要考虑前半部分的问号个数即可,如果剩下的问号个数加上已出现的字母小于k,说明继续填充也不符合条件,也是无解的。

如果剩下的问号足以填充完前k个字符的空白,比如还剩3个字符没有出现,前半部分的问号有5处,出于字典序最小的考虑将前两处用’a’填充,后面自小到大的填充缺失的字符即可。

代码

#include 
#include 
#include 
using namespace std;
bool m[30];
vector v;
int main() {int k;string name;cin>>k>>name;int n = name.size();bool flag = false;int n1 = (n + 1) / 2;for(int i = 0; i < n1; i++) {if(name[i] == '?') {if (name[n-1-i] != '?') {name[i] = name[n-1-i];m[name[i] - 'a'] = true;} else {v.push_back(i);}} else {if (name[n-1-i] == '?') name[n-1-i] = name[i];else {if (name[n-1-i] != name[i]) {flag = true;break;}}m[name[i] - 'a'] = true;}}if (flag) {cout<<"QAQ"<int cnt = 0;int si = v.size();vector tmp;for (int i = 0; i < k; i++) {if(!m[i]) {cnt++;tmp.push_back(i);}}if (cnt > si) {cout<<"QAQ"<for (int i = 0; i < si - cnt; i++) {name[v[i]] = name[n-1-v[i]] = 'a';}int p = 0;for (int i = si - cnt; i < si; i++) {name[v[i]] = name[n-1-v[i]] = 'a' + tmp[p++];}cout<

3.蛇形矩阵

题目描述

给你一个整数n,输出n∗n的蛇形矩阵。

输入描述:

输入一行,包含一个整数n

输出描述:

输出n行,每行包含n个正整数,通过空格分隔。

输入样例:

4

输出样例:

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

分析

虽然老早之前做过这题,但是许久没做还是花了不少时间。观察用例可以发现,矩阵数字的走向分为向右、向左下,向下以及向右上。其中向右或者向下方向至多走一步,左下和右上则需要走到头。如果使用一类方向向量,机械的重复最开始的几步,很容易出问题,因为一旦下一步不合法,要走的顺序就会乱掉,这里我使用了两类方向向量。

dx1和dy1来控制向右和向下,dx2和dy2来控制左下和右上。遍历规则如下:

第一类方向向量和第二类方向向量轮流走。

执行第一类向量,下一步合理则走到下一步,同时将控制权交给第二类向量。下一步不合理则第一类向量换个方向继续走,也就是向右走过头了就转而向下走。

执行第二类向量,下一步合理就继续走,一直走到下一步不合理时,将下一步的控制权交给第一类向量。

有一点需要注意,最后一个数字不一定在右下角,所以如果使用坐标作为结束遍历的条件可能会死循环。CSDN这类题目一旦出现一个用例TLE,是没有分数的,所以还是用元素个数作为结束条件比较靠谱。

代码

#include 
#include 
#include 
#include 
using namespace std;
const int N = 105;
int g[N][N];
int dx1[] = {0, 1};
int dy1[] = {1, 0};
int dx2[] = {1, -1};
int dy2[] = {-1, 1};
int main() {int n;std::cin>>n;int p = 2;g[0][0] = 1;int x = 0, y = 0;int nx = 0, ny = 0;int p1 = 0,p2 = 0;int t = 1;while(true) {if (t) {nx = x +dx1[p1], ny = y + dy1[p1];} else {nx = x + dx2[p2], ny = y + dy2[p2];}if (nx < 0 || nx >= n || ny < 0 || ny >= n) {if (t) p1 = 1 - p1;else {p2 = 1- p2;t = 1 - t;}continue;}if (t) {t = 1 - t;p1 = 1 - p1;}x = nx, y = ny;g[x][y] = p++;if (p - 1 == n * n) break;}for (int i = 0; i < n; i++) {for(int j = 0; j < n; j++) {cout<

4.放货物

题目描述

小明是一名快递员,他现在手上一共有N个快件需要运送。但是货车有限,所以我们希望用最少的货车来进行工作。现在已知,一辆车的限定额度为最多放置K件货物。此外,小明很不喜欢13这个数字,所以他不希望任何一辆货车中的货物数量为13。
现在小明想要知道,最少使用多少辆货车能够将这N个快件都放置到货车上。

输入描述:

题目包含多组输入
每一组输入一行两个数,分别表示N 和 K
1<=N<=1000
1<=K<=1000

输出描述:

输出一行一个数字,表示最优结果。

输入样例:

13 13
5 2

输出样例:

2
3

分析

貌似是第三期竞赛的原题,这竞赛不出新题也就算了,题目与以往竞赛重复就没啥意思了。本题需要细心的分类讨论。

如果每辆货车的限额k是13,那么我们每辆只放12个,即k–;

满打满算可以先放完n / k辆车,还剩n % k个货物,如果剩下的货物是0,就不需要增加货车了;如果剩下的货物不是13,就放一辆车装;如果剩下的货物是13,原则上也可以放一辆车上,只需要从前面车上再拿一个货物过来,让最后一辆车上数量变成14即可,但是前提是k不为14,否则前面的车上拿掉一个数量就变成13了,拿掉2个最后一辆车就变成15超载了,这种情况就需要放两辆车上了。当然也需要考虑货物总数恰好是13个的情况,这样只能放两辆车。

PS:既然讨厌13这个数字,仅仅每辆车不装13个货物哪够,要是货车总数是13不更闹心嘛。

代码

#include 
#include 
#include 
#include 
using namespace std;
int main() {int n, k;while(cin>>n>>k) {if (n == 13 && k >= 13) {cout<<2<

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...