【Acwing 周赛复盘】第90场周赛复盘(2023.2.11)

news2024/10/2 13:13:24

【Acwing 周赛复盘】第90场周赛复盘(2023.2.11)

周赛复盘 ✍️

本周个人排名:1488/2884

AC情况:1/3

这是博主参加的第五次周赛,这次做题的时候,感觉题目好难 😂

但是一听y总讲解,又感觉这次题目还是比较简单的,自己为什么就没想出来呢 😭

归根结底,还是自己太菜了,仍需不断努力。💪

T1 签到题,读懂题意即可AC。✅

T2 贪心,但是贪心策略以及边界条件有一些复杂,导致自己写代码时,思路很乱。有一种哪里都能下手,但是哪里又都不能下手的感觉,现场未 AC。❌ (后来看y总讲解后,把思路理清了,就顺利写出了代码)

T3 贪心+字符串,现场经过长时间的推导,发现了贪心策略以及前后缀,但是因为一些小错误(如判断 abcdcba,由于写的是 s[i] == s[n-i+1](是判断「首尾对称」的写法,而不是前后缀的判断),导致出现错误),现场未能AC ❌ (经过y总讲解后,觉得有必要学习一下 KMP 的相关内容)

image-20230222102506046


周赛信息 📚

时间:2023年 2 月 11 日 19:00-20:15

竞赛链接:https://www.acwing.com/activity/content/2870/

y总直播间:http://live.bilibili.com/21871779

y总录播讲解视频:【AcWing杯 - 第 90 场周赛讲解】


题目列表 🧑🏻‍💻

题目名称原题链接视频讲解难度
4806. 首字母大写原题链接视频链接简单 🟢
4807. 找数字原题链接视频链接中等 🟡
4808. 构造字符串原题链接视频链接困难 🔴

题解 🚀

【题目A】首字母大写

【题目描述】

给定一个由大小写字母构成的单词。

如果单词的首字母为小写字母,则请你将该首字母转换为对应大写字母。

如果单词的首字母为大写字母,则不做任何变化。

输出最终的单词。

【输入】

一个由大小写字母构成的非空字符串,表示给定单词。

【输出】

输出最终的单词。

【数据范围】

3 3 3 个测试点满足,输入单词长度范围 [ 1 , 10 ] [1,10] [1,10]

所有测试点满足,输入单词长度范围 [ 1 , 1000 ] [1,1000] [1,1000]

【输入样例1】

ApPLe

【输出样例1】

ApPLe

【输入样例2】

konjac

【输出样例2】

Konjac

【原题链接】

https://www.acwing.com/problem/content/4809/


【题目分析】

签到题,使用 toupper() 函数 或者 s[i] - 32 的形式都可以。

【周赛现场 AC 代码】

#include<bits/stdc++.h>

using namespace std;

string s;

int main() {

    cin >> s;
    // 转换首字母
    if (s[0] >= 'a' && s[0] <= 'z') s[0] = s[0] - 32;
//    s[0] = toupper(s[0]);
    cout << s << endl;

    return 0;
}


【题目B】找数字

【题目描述】

给定一个正整数 m m m 和一个非负整数 s s s

请你找到长度为 m m m 且各位数字之和为 s s s 的最小和最大 非负 整数。

要求所求非负整数不得包含前导零。

【输入】

共一行,两个整数 m , s m,s m,s

【输出】

在一行内输出满足条件的最小和最大 非负 整数。

如果无解,则输出 -1 -1

【数据范围】

6 6 6 个测试点满足 1 ≤ m ≤ 3 1 \le m \le 3 1m3

所有测试点满足 1 ≤ m ≤ 100 1 \le m \le 100 1m100 0 ≤ s ≤ 900 0 \le s \le 900 0s900

【输入样例1】

2 15

【输出样例1】

69 96

【输入样例2】

3 0

【输出样例2】

-1 -1

【原题链接】

https://www.acwing.com/problem/content/4810/


【题目分析】

贪心

该题的贪心策略还是比较好想的,但是从 「贪心策略 → 具体代码」 的实现其实还是比较难的,需要考虑一些边界条件(如果是第一次做这种类型的题目的话)

【复盘后的优化代码】✅

#include<bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(false);  //cin读入优化
    cin.tie(0);

    int sum, m;
    cin >> m >> sum;

    // m位数之和最大为 9 * m,若sum>9*m,无解
    // sum为0时,m位数大于1,也无解
    if (sum > 9 * m || sum == 0 && m > 1) cout << "-1 -1" << endl;
    else {
        // 创意长度为m,内容均为' '的字符串,下标从0开始
        string a(m, ' '), b(m, ' ');

        // 求最大值(高位尽可能放大的数)
        int tmp = sum;
        for (int i = 0; i < m; i++) {
            int t = min(9, tmp);
            a[i] = t + '0';
            tmp = tmp - t;
        }

        // 求最小值(第一位起码最少是1)
        // 从最后一位开始,从大数开始填
        for (int i = m - 1; i > 0; i--) {
            int t = min(9, sum - 1);  // 可以以样例为例子来理解
            b[i] = t + '0';
            sum = sum - t;
        }
        b[0] = sum + '0';

        // 输出结果
        cout << b << " " << a << endl;
    }

    return 0;
}

【周赛现场 AC 代码】

周赛现场未 AC



【题目C】构造字符串

【题目描述】

给定一个长度为 n n n 的由小写字母构成的字符串 t t t 以及一个整数 k k k

请你构造一个字符串 s s s,要求:

  1. 字符串 s s s 恰好有 k k k 个子串等于字符串 t t t
  2. 字符串 s s s 的长度尽可能短。

保证一定存在唯一解。

【输入】

第一行包含两个整数 n , k n,k n,k

第二行包含一个长度为 n n n 的由小写字母构成的字符串 t t t

【输出】

输出满足条件的字符串 s s s

保证一定存在唯一解。

【数据范围】

3 3 3 个测试点满足 1 ≤ n , k ≤ 4 1 \le n,k \le 4 1n,k4

所有测试点满足 1 ≤ n , k ≤ 50 1 \le n,k \le 50 1n,k50

【输入样例1】

3 4
aba

【输出样例1】

ababababa

【输入样例2】

3 2
cat

【输出样例2】

catcat

【原题链接】

https://www.acwing.com/problem/content/4811/


【题目分析】

贪心 + 前后缀

贪心策略比较容易想到,最差的情况就是把 k 个原字符串排列在一起,能够优化的情况就是相邻的两个原字符串存在重叠部分(即前缀和后缀是相同的)

前后缀 概念的举例说明:字符串 abcXXXXabc 的前缀 abc 和后缀 abc 是相等,长度为3。

因此,需要找到长度最大的,相同的前缀和后缀,然后再进行输出即可。

判断 前后缀相同 的方法:

  • KMP 算法
  • str.substr(0,cnt) == str,substr(cnt-n,cnt) 判断式枚举

🍉 PS 1:前后缀长度不能为 str.length,即原字符串长度。否则会出现 「前缀 = 后缀 = 本身」的情况,这个对于任何字符串都是成立的。

🍉 PS 2:「前后缀相等」的判断不能和 「前后缀对称」 的判断搞混。比如,字符串 abcXXXcba 应该是前缀和后缀对称的情况,而非相等的情况。前者是用 KMP 算法 或者 str.substr(pos,length) 来对比,后者是用 str[i] == str[n - i + 1] 的方式来判断。

🍉 PS 3:该题在枚举长度时,不能用「二分」来做,因为不满足「二段性」。如字符串 abcXXXabc,此时长度为 3,前缀后缀均为 abc,满足条件,因此需要继续找长度更大的;但是在长度为 2 时,前缀 ab 和 后缀 bc 不同,此时既要往长度大的找(如上面长度为 3 时就满足),又要往长度小的找(因为长度更大的可能全部不满足),所以不具有二段性。

【复盘后的优化代码】✅

  1. substr(pos,len) 前后缀暴力枚举对比
#include<bits/stdc++.h>

using namespace std;

int n, k;
string str;

int main() {
    cin >> n >> k;
    cin >> str;

    // 统计前后缀的长度
    int cnt = 0;
    for (int i = 1; i <= n - 1; i++) { // 前后缀长度不能为n,不然前缀=后缀=本身
        if (str.substr(0, i) == str.substr(n - i, i))
            cnt = i;
    }

//     输出结果
//     先输出第一个字符串
    for (int i = 0; i < n; i++) cout << str[i];
    // 在后面拼接k-1个字符串
    for (int i = 1; i <= k - 1; i++) {
        for (int j = cnt; j < n; j++) {
            cout << str[j];
        }
    }
    // 上面的输出代码可以优化
//    cout << str;  // 先输出1个完整的str
    // 再输出k-1个子串,str.substr(cnt) 表示输出从下标cnt开始的到结尾的子串
//    for (int i = 1; i <= k - 1; i++) cout << str.substr(cnt);

    return 0;
}

在数据范围更加大的题目中,使用 KMP 算法是更好的选择。

  1. KMP 算法计算前后缀(y总代码)
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 55;

int n, m;
char str[N];
int ne[N];

int main()
{
    scanf("%d%d", &n, &m);
    scanf("%s", str + 1);
    for (int i = 2, j = 0; i <= n; i ++ )
    {
        while (j && str[i] != str[j + 1]) j = ne[j];
        if (str[i] == str[j + 1]) j ++ ;
        ne[i] = j;
    }

    printf("%s", str + 1);
    for (int i = 0; i < m - 1; i ++ )
        printf("%s", str + 1 + ne[n]);

    return 0;
}

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

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

相关文章

ORA error集锦

1、oralce 数据客户端需要安装的问题 保存信息为&#xff1a; “无法连接到数据库&#xff0c;因为数据库客户端软件无法加载。确保已正确安装并配置数据库客户端软件” 从百度网盘下载&#xff0c;并安装win32 oracle client 安装包 2、ORA错误 “执行异常,ORA-00911: inval…

TCP四次挥手

TCP 四次挥手过程是怎样的&#xff1f; TCP 断开连接是通过四次挥手方式。 双方都可以主动断开连接&#xff0c;断开连接后主机中的「资源」将被释放&#xff0c;四次挥手的过程如下图&#xff1a; 客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1…

Revit标注问题:尺寸界线长度和“快速尺寸定位标注”

一、 Revit中关于标注的问题 1.有时候&#xff0c;但我们建完模型要进行一定的标注&#xff0c;往往会出现这样的间题&#xff0c;如图1所示 按照正常的标注来说&#xff0c;通常它的标注的正确方式应该是这样的&#xff0c;尺寸界线长度应该是指向图元的&#xff0c;如图2所示…

【源码系列】Faster RCNN源码详解(一)——transform

系列文章目录 文章目录系列文章目录前言一、transform二、总结1.标准化2.缩放3.batch前言 Faster RCNN的源码整体可以分为7个模块&#xff0c;每个模块负责不同的功能。推荐B站up霹雳吧啦Wz讲解的Faster RCNN源码&#xff0c;已经很详细了&#xff0c;这里只是个人的一些理解总…

【Unity VR开发】结合VRTK4.0:创建滑块

语录&#xff1a; 只有经历地狱般的磨练&#xff0c;才能炼出创造天堂的力量。 前言&#xff1a; 滑块是一个非常简单的控件&#xff0c;它允许通过沿有限的驱动轴滑动 Interactable 来选择不同的值。我们将使用线性驱动器创建一个滑块控件&#xff0c;该控件允许我们根据与滑…

蓝桥杯刷题五

1.01背包问题这题就是01背包问题的模板题 回顾一下01背包 01就是这个东西选和不选01背包的表达式是f[i]max(f[i-v]w,f[i]);那么这题就可以直接做了 值得注意的是这里只用了一维数组 所以更新的时候要从后往前面更新#include <bits/stdc.h> using namespace std; const in…

【JDK8新特性之Stream流-Stream结果收集案例实操】

一.JDK8新特性之Stream流-Stream结果收集以及案例实操 二.Stream结果收集(collect函数)-实例实操 2.1 结果收集到集合中 /*** Stream将结果收集到集合中以及具体的实现 collect*/Testpublic void test01(){// 收集到List中 接口List<Integer> list Stream.of(1, 2, 3…

码住!新手容易上手的5个tiktok数据分析网站

当下短视频已经称霸了各大内容平台&#xff0c;越来越多的创作者进入到短视频赛道&#xff0c;为了更好地运营自己的内容平台&#xff0c;数据分析是必不可少的。很多人都入局了tiktok&#xff0c;对于商家或者博主红人来说&#xff0c;这是比较新平台&#xff0c;希望能在这个…

Spring Cloud Gateway的使用

Spring Cloud Gateway网关Spring Cloud Gateway三大核心概念Route(路由)Predicate(断言)Filter(过滤)开始使用动态路由配置路由断言过滤器实现TokenIP验证拦截Spring Cloud Gateway 网关&#xff1a;微服务中最边缘的服务&#xff0c;用来做用户和微服务的桥梁 没有网关❓&…

Python使用VTK对容积超声图像进行体绘制(三维重建)

目录VTK简介什么是体绘制&#xff1f;体绘制效果图流程CodeQ&AReferenceVTK简介 VTK&#xff08;Visualization Toolkit&#xff09;是一个用于3D计算机图形学、图像处理和可视化的开源软件包。它包括一组C类和工具&#xff0c;可以让用户创建和处理复杂的3D图形和数据可视…

论文投稿指南——中文核心期刊推荐(音乐)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

超纯水制备,MB-106UP抛光树脂的技术解析

超纯水&#xff08;Ultrapure water&#xff09;又称UP水&#xff0c;是指电阻率达到18 MΩ*cm&#xff08;25℃&#xff09;的水。这种水中除了水分子外&#xff0c;几乎没有什么杂质&#xff0c;更没有细菌、病毒、含氯二噁英等有机物&#xff0c;当然也没有人体所需的矿物质…

低代码是什么意思?企业为什么要用低代码平台?

低代码是什么意思&#xff1f;企业为什么要用低代码平台&#xff1f; 这两个问题似乎困扰了很多人&#xff0c;总有粉丝跟小简抱怨&#xff0c;一天到晚念叨低代码&#xff0c;倒是来个人解释清楚啊&#xff01; 来了&#xff0c;这次一文让你全明白。 先解释这几个名词&…

mysql5.7.39数据库服务搭建(win10)

mysql下载下载地址&#xff1a;https://downloads.mysql.com/archives/community如上图&#xff0c;选择了mysql 5.7.39版本&#xff0c;64位Windows操作系统&#xff1b;然后下载ZIP Archive格式的安装文件&#xff0c;点击“Download” 按钮即可。下载好后&#xff0c;进行解…

kafka入门到精通

文章目录一、kafka概述&#xff1f;1.定义1.2消息队列1.2.1 传统消息队列的使用场景1.2.2 消息队列好处1.2.3 消息队列两种模式1.3 kafka基础架构二、kafka快速入门1.1使用docker-compose安装kafka1.2测试访问kafka-manager1.3 查看kafka版本号1.4 查看zookeeper版本号1.5 扩展…

win11右键新建菜单添加选项

需要操作 2 处注册表&#xff0c; 以下以在右键新建菜单中添加 .html 为例 在主键 HKEY_CLASSES_ROOT 中&#xff0c;搜索 .html 找到后 &#xff0c;右键点击它&#xff0c;选 新建 ->项&#xff0c; 在这里插入图片描述 项目名字是&#xff1a;ShellNew 新建后&#x…

【Linux学习笔记】4.Linux 文件基本属性及文件与目录管理

前言 本章介绍Linux的文件基本属性和文件与目录管理。 Linux 文件基本属性 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。 为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录…

Linux命令及CPU占用过高的定位分析思路

一、vim命令不要使用vim打开大文件&#xff0c;vim会一次性读取所有内容到内存&#xff0c;容易造成宿主机内存溢出。 打开文件前&#xff0c;可以使用du -h命令查看文件大小。一般&#xff0c;100MB以下为宜。1、普通模式j 向下30j 向下移动30行k 向上h 向左l 向右0 到行首^ 到…

3.15版本poi导致FileMagic文件找不到问题解决过程记录

maven中的dependencies和dependencyManagement的区别_shenzhou_yh的博客-CSDN博客 maven 中 dependencies 与 dependencyManagement 的区别_Jaemon的博客-CSDN博客_snapshot dependencies和artifact dependencies的区别 com.alibaba.excel.exception.ExcelAnalysisException: …

ubuntu/linux系统知识(37)systemd管理临时文件的方法systemd-tmpfiles

1、systemd-tmpfiles Linux产生大量的临时文件和目录&#xff0c;例如/tmp、/run 。systemd提供了一个结构化的可配置方法来管理临时文件和目录&#xff0c;即systemd-tmpfiles工具和配套的几个服务&#xff0c;以实现创建、删除和管理临时文件。 systemd创建了几个调用syste…