2023年第六届广西大学生程序设计竞赛(正式赛)题解

在这里插入图片描述

比赛题目链接,可以继续提交代码: 2023年第六届广西大学生程序设计竞赛(正式赛)
|
知乎:如何评价第六届广西大学生程序设计竞赛?

难度题号备注
签到题A J K已给出题解和代码
普通题B D E H已给出题解和代码
中等题C G I给出 I 题代码
难题F L M

没有渠道获取官方题解PPT,结合平台上的过题代码和chatgpt尝试讲解。
多有纰漏,恳请指正!!!

文章目录

  • 签到题
  • A Alpha, Beta, Omega
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • J June
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • K Keyboard
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • 普通题
  • B Brilliant Idea
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • D Dream Team
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • E Evil Capitalist
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • H Hide and Seek
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • 中等题
  • I Indivisible Partition
    • 题目大意:
    • 解题思路:
    • 参考代码c++
  • 难题

签到题

A Alpha, Beta, Omega

A Alpha, Beta, Omega

题目大意:

抽牌游戏。每次抽 k 张牌 ,抽到一张 α 就 放入一张新的 β , 抽到一张 β 就 放入一张新的 Ω ,抽到一张 Ω 代表游戏胜利。询问在运气最差的时候,至多抽多少次才会胜利。

解题思路:

运气最差,自然是 先抽完 α ,再抽完 β ,最后才抽到 Ω 。

其实不用特意处理 抽 α 抽完了 还要同时抽 β 的情况。

抽到一张 α 就 放入一张新的 β ,就说明 α 要被抽两次( α 和 新的β )。

就直接 (a*2+b)/k+1 就行。

参考代码c++

#include <iostream>
using namespace std;
int main()
{int a,b,o,k;cin>>a>>b>>o>>k;if(a+b<k) cout<<1;else cout<<((a*2+b)/k+1);return 0;
}

J June

J June

题目大意:

取两个字符串,按指定方式输出。

解题思路:

送分题。

参考代码c++

#include<iostream>
using namespace std;int main(){string s,t;cin>>s>>t;cout<<"Good luck to "<<s<<" in "<<t<<" and have fun!";
}

K Keyboard

K Keyboard

题目大意:

不断将当前字符串进行复制并粘贴到其后面,询问是否有机会能够与另一个字符串相吻合

解题思路:

其实不用 特意判断 第一次复制粘贴的情况, 只要当前字符串长度小于另一个字符串长度就循环复制粘贴自身就行。

当然也可以提前判断下是否满足幂数倍,不判断其实也能过题。

参考代码c++

#include<iostream>
using namespace std;
string s,t;int main()
{cin>>s>>t;while(s.size()<t.size())s+=s;if(s==t) cout<<"Smart People's Big Win!";else cout<<"Lazy Dog's Great Failure...";return 0;
}

普通题

B Brilliant Idea

B Brilliant Idea

题目大意:

这道题目让我们玩一个字符串的游戏,每次可以选择一个子串,把这个子串中的字符都变成该子串中的任意一个字符。游戏的目标是尽可能多地进行操作。猜猜在所有长度为 n 且只由小写字母构成的字符串中,有多少个字符串能够达到以下三种情况中的一种:

  • 通过变化不能达到任何两个字符相同的状态;
  • 通过有限次变化能够达到任何两个字符不同的状态;
  • 无论进行多少次变化,都无法达到任何两个字符不同的状态。

解题思路:

n=2 时是一种特例,单独输出即可。
n>2 时

  • 第一问需要我们计算出长度为 n 的字符串中有多少个没有相邻相同字母的字符串。其实只有 aa , bb … zz ,这些情况满足,即 26 种。
  • 第二问需要我们判断给定的字符串能否经过有限次操作后变成只包含一个字母。其实推导以下发现并不能满足,要么属于第一种情况,要么属于第三种情况,即 0 种。
  • 三问需要我们判断给定的字符串是否可以无限次进行操作。如果该字符串的长度为偶数,那么直接构造一类字符串即可。

参考代码c++

#include <iostream>
using namespace std;
long long a,b,c=26ll,sum=1,mod=1e9+7;
int main()
{cin>>a;if(a==2) cout<<"26 650 0";else{b=a%mod;while(b>0){if(b&1) sum=(sum*c)%mod;c=(c*c)%mod;b>>=1;}cout<<"26 0 "<<(sum-26+mod)%mod;}return 0;
}

D Dream Team

D Dream Team

题目大意:

将 3n 个人分成 n 个团队,每个团队有三个人,并且要最小化所有人的焦虑值之和。对于一个人,他的焦虑值等于他所在团队中他不认识的人的数量。

解题思路:

本题可以使用并查集相似的思路进行求解。

对于一个团队中的学生而言,它们都是互相熟悉的,如果我们把其中的一个学生看做代表,那么这个代表所在的连通块就是这个团队能够扩展到的全部学生。因此,我们可以考虑将同一个连通块内的所有学生分到同一个组中,这样不会增加任何一个学生的焦虑值。

对于一个学生 u 而言,我们可以使用并查集等方法求出它所在的连通块 c_u ,然后对于每个团队 t,我们判断 t 中是否存在一个学生 v 所在的连通块 c_v 与 c_u 相同。如果存在这样的 v,那么 t 中的所有学生都能够被分配到和 u 相同的组中,此时团队 t 的焦虑值为 0;否则 t 中的每个学生都需要被分配到和 u 不同的组中,其焦虑值为团队成员之间不熟悉的人数。

综上所述,我们可以遍历每个学生 u,对于每个团队 t 判断它们是否能被分到同一个组内。然后将所有团队的焦虑值加起来,这就是答案。

有同学对 a>=b 时结果是 b*4+(a-b)/3*8 有疑问,解释一下

把"a"拆成b和a-b,那"a"中的b部分就可以和"b"组队,结果就是b4,"a"中剩下的a-b就要单独处理强制组队,并且剩下的a-b是一定可以组完的,且组合一定是"每6人组两队"的形式。可以举个例子更好理解: a-b=6,可以组两队,分别是110和110(1代表认识,0代表不认识),此时结果是4+4=8,即6人(3人一队)组两队结果为8,可以写成(a-b)/38的形式。

参考代码c++

#include <iostream>
using namespace std;
int n,m,x,y,a,b,f[3000001],d[3000001],i;
int fnd(int a){return f[a]==a?a:f[a]=fnd(f[a]);
}
int main()
{cin>>n>>m;n*=3;for(;i<n;i++) f[i]=i,d[i]=1;for(i=0;i<m;i++){scanf("%d%d",&x,&y);x=fnd(x),y=fnd(y);if(x!=y) f[x]=y,d[y]+=d[x];}for(i=0;i<n;i++){if(f[i]==i){if(d[i]%3==2) a++;if(d[i]%3==1) b++;}}cout<<(a>b?b*4+(a-b)/3*8:(a+b)*2);return 0;
}

E Evil Capitalist

E Evil Capitalist

题目大意:

有一个公司雇佣了 n 个员工,每个员工的工资为 a_i 元。如果一个员工的工资比他下面的员工的工资高,那么这个员工就会感到不满意。为了防止员工罢工,公司可以选择进行若干次两人谈话,让他们互相知道彼此的工资,并且对不满意的员工进行适当的工资调整,使得最后只有一个员工感到不满意,其他员工都感到满意。问公司最少需要支付多少元才能实现该目标。

解题思路:

这道题目是一个经典的贪心算法问题。我们可以先将所有员工按照工资从高到低排序,并将所有人都初始化为不满意状态。接下来,我们遍历每个员工,如果该员工还没有被处理过,那么我们就找到他下面第一个比他工资低的员工,然后进行以下操作:

如果两个员工工资相同,那么他们都变成满意状态。
如果下方员工比当前员工工资低,那么下方员工变成满意状态,当前员工工资上涨到下方员工的工资。然后继续向下查找,直到没有比当前员工工资低的员工。
这样处理完所有员工之后,就可以得到最终需要支付的总金额了。时间复杂度为 O(nlogn),其中 n 为员工数量,主要消耗在排序操作上。

参考代码c++

#include <bits/stdc++.h>
using namespace std;
long n,sum,mx,cnt,now,a[200001],i;
int main()
{cin>>n;while(i<n) scanf("%d",&a[i++]);sort(a,a+n);a[n]=2e9;for(i=1;i<=n;i++){if(a[i]==a[i-1]) cnt++;else{now=cnt%2?0:a[i]-a[i-1];sum+=now;mx=max(mx,now);cnt=0;}}cout<<sum-mx;return 0;
}

H Hide and Seek

H Hide and Seek

题目大意:

这道题目的题意是,给定一个正整数 x (1≤x≤a),以及 m 个约束条件,每个约束条件形如 b_j mod x =c_j 。求在满足所有约束条件的前提下,[1,a] 中有多少个正整数同时满足所有条件。保证存在至少一个满足条件的正整数。

解题思路:

使用循环读入每个约束条件,计算出 b_j −c_j 的最大公约数 gcd,并计算出满足所有约束条件的最小正整数 l。

从 1 到 gc 的平方根,枚举 gcd 的每个因子 i。如果 i 满足要求,则令 ans 自增 1;如果 gcd/i 也满足要求且 gcd/i 不等于 i,则同样令 ans 自增 1。最后输出 ans,即为满足约束条件的正整数的数量。

gcd=0 时应当直接输出 a−l+1。

参考代码c++

#include<bits/stdc++.h>
using namespace std;
int m,a,b,c,gc,l=1,i=1;
int main(){cin>>m>>a;while(m--){scanf("%d%d",&b,&c);gc=__gcd(b-c,gc);l=max(l,c+1);}if(!gc){cout<<a-l+1;return 0;}for(;i*i<gc;i++)if(gc%i==0&&gc/i<=a&&gc/i>=l) m++;cout<<++m;
}

中等题

I Indivisible Partition

I Indivisible Partition

题目大意:

定义一个字符串是不可分解的,当且仅当他不是某个非平凡前缀重复整数倍得到。

定义一个不可分解的分割是,把一个字符串切成若干段,每段都不可分解。

问 S 有多少种不同的不可分解的分割。

解题思路:

官方题解:

对 KMP 比较熟悉的话,会知道一个字符串的最小循环节为 n − border[n] ,且其他循环节一定是这个循环节的倍长。

那么一个串不可分解的条件就是 (n − border[n]) ̸ |n 或 border[n] = 0 。

在这个基础上进行 dp ,设 f[i] 为前 i 个字符有多少种不同的分割方式。

转移为对于所有的 j < i 且 S[j + 1 : i] 为不可分解的,f[i] = ∑f[j] 。

对于一个 i ,需要我们判断每个以 i 结尾的子串的 border 。

这可以对 S[1 : i] 翻转后求 KMP 得到,总复杂度 O(n^2) 。

空间限制是为了卡掉预处理所有后缀的 KMP 结果的做法。

参考代码c++

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+10;
const int MOD=998244353;
string s;
int fail[maxn];
int dp[maxn];
int n,k;
int main(){ios_base::sync_with_stdio(false);cin>>s;n=s.length();dp[n]=1;for(int i=n-1;i>=0;i--){char*f=&s[i];k=0;dp[i]=dp[i+1];for(int j=1;j<n-i;j++){while(k!=0&&f[j]!=f[k]) k=fail[k-1];if(f[k]==f[j]) k++;fail[j]=k;if(fail[j]==0||(j+1)%(j+1-fail[j])!=0)dp[i]=(dp[i]+dp[i+j+1])%MOD;}}printf("%d",dp[0]);return 0;
}

其他题还没有研究到🧐


难题

超出我所能想象的程度了hhhh,希望有大佬可以补上😊


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

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

相关文章

Python 集合应用之“简易英语词汇生词本”

# 英语生词本""" 介绍&#xff1a;背单词是学英语最基础的一环&#xff0c;不少学生在背单词的过程中会整理自己的生词本&#xff0c;以不断拓展自己的词汇量。知识点&#xff1a;1、集合的创建、增添、删除、查询、遍历2、循环语句&#xff1a;while、for3、条…

英文诗歌数据-绘制英文词云图+英文本文分类(pytorch)

英文诗歌数据-绘制词云图本文分类 本项目包含&#xff1a; 1.文本处理 2.词云图绘制 3.文本分类 往期文章可以关注我的专栏 下巴同学的数据加油小站 或者关注CSDN 会不定期分享数据挖掘、机器学习、风控模型、深度学习、NLP等方向的学习项目 数据和完整代码文末链接可以下载 …

EasyNLP玩转文本摘要(新闻标题)生成

作者&#xff1a;王明、黄俊 导读 文本生成是自然语言处理领域的一个重要研究方向&#xff0c;具有丰富的实际应用场景以及研究价值。其中&#xff0c;生成式文本摘要作为文本生成的一个重要子任务&#xff0c;在实际应用场景中&#xff0c;包括新闻标题生成、摘要生成、关键词…

微信聊天记录生成词云图

微信聊天记录生成词云图 基本材料准备 电脑微信客户端、手机微信客户端、电脑mumu安卓模拟器&#xff08;安装微信和RE文件管理器&#xff09;、sqlcipher.exe、idea 获取微信聊天记录 电脑微信客户端备份聊天记录 微信左下角点击备份与恢复按钮出现如下弹窗 然后点击左侧…

txt文件英语单词词频统计

目录 一、需求分析 二、相关库列表 三、代码在此 四、一些问题 一、需求分析 把txt文件里的英语单词按照出现次数排序并生成csv文件&#xff0c;如果次数相同按照单词的md5值来排序 二、相关库列表 pandasrecollectionshashlib 三、代码在此 打开文件 txt_file open(f…

从文本中提取单词生成单词本

词频统计及单词提取 对一段英文文本做词频统计&#xff0c;提取单词&#xff0c;查词&#xff0c;最终生成一个单词本&#xff0c;生成的单词本可以导入Anki中学习。 问题分析 考虑到单词的变形&#xff0c;分词后先做词形还原&#xff0c;之后再进行词频统计。去除掉较为简…

给英文文章加音标,建生词表

先上个效果图 10. Thats WhyJimmy/ˈʤɪmi/ 吉米more/mɔː/ adj.更多的adv.更started/ˈstɑːtɪd/[start]v.开始&#xff0c;着手&#xff0c;发动were/wɜː/ (be/biː/ was/were been) v.是&#xff0c;存在painting/ˈpeɪntɪŋ/ n.画&#xff0c;绘画(艺术)different/…

生词提取方法,学以致用(用于生成学习计划)

为了能够更加便捷的吸收英文文章的养分,从下周开始,计划边读文章,边学习。在拿到一片英文材料后,首先识别其中已经知道的单词,然后识别自己不会的单词。根据不会的单词制定单词学习计划。单词掌握以后,学习内容,既确保学以致用,又确保能够吸收到优秀文章的养分。 我的初…

英语词缀与英语派生词词典读书笔记,并总结输出思维导图

大部分构词法知识在词根章节已说到&#xff0c;这里以词缀相关知识点作为重点讲述&#xff1b; 本文摘抄总结于 “英语词缀与英语派生词词典 - 李武平“ 往期文章&#xff1a; 英语词根与说文解字词典读书笔记&#xff0c;并总结输出思维导图 目录 思维导图 一、词缀概述…

英语ai文章生成器,英语文章生成器在线

英语AI文章生成器是一种基于人工智能技术的语言处理工具&#xff0c;能够自动生成各类英语文章。然而&#xff0c;由于其自动化特性&#xff0c;有时候生成的文章可能存在一些问题&#xff0c;比如语法错误、逻辑不清等。那么&#xff0c;如何提高英语AI文章生成器的写作质量呢…

文本挖掘之WordCloud+Python3快速生成中英文词云图

引言: “词云”&#xff0c;又称文字云&#xff0c;是由词汇组成类似云的彩色图形。可对网络文本中出现频率较高的“关键词”予以视觉上的突出&#xff0c;形成"关键词云层"或"关键词渲染"&#xff0c;从而过滤掉大量的文本信息&#xff0c;使浏览网页者只…

python统计文章中高频词汇并生成词云

LZ的同事写的文章经常被公司或者上级部门发表&#xff0c;LZ对此觉得同事写的文章一定有什么套路或者经常使用的词句&#xff0c;所以LZ收集了6篇同事的文章希望统计出其文章的高频词语以此可以效仿。 首先&#xff0c;把6篇文章放在同一个Text文档中&#xff0c;准备好词云需…

掌阅科技让数字化阅读更便捷

阅读是快速让人提高的方法,不需要你花很多的钱只需要你沉下心耐着性子从书中得到知识与经验,掌阅科技作为一家在国内领先的数字化阅读平台更是为无数爱好阅读的人提供便利。古书有云“书中自有颜如玉,书中自有黄金屋”。现在社会的阅读可能没有颜如玉和黄金屋,但是阅读还是可以…

掌阅科技与厦门航空联合推出首个机上阅读服务“天际悦读”

【TechWeb】6月27日消息&#xff0c;掌阅科技和厦门航空今日联合宣布&#xff0c;将推出全国首个常态化空中阅读服务“天际阅读”。 厦门航空空中乘务部副总经理张玉晶指出&#xff0c;厦航经过对旅客画像、出行习惯与需求&#xff0c;以及行业发展趋势的综合分析后&#xff0c…

高清3D人体解剖图谱

目前见过的高清3D人体模型最好的一个了&#xff0c;截图供大家欣赏&#xff0c;这个可能我通过微信传的时候像素有损失&#xff0c;大家大量&#xff0c;我截取的当然也只有平面图&#xff0c;3D的效果&#xff0c;请恕我的无能&#xff0c;还不知道3D的人体模型要怎么截取。话…

PXI机箱大解剖

上一节给大家介绍了PXI的背景和历史&#xff0c;让我们对PXI的起源有了更多的认识。同时对PXI机箱做了初步介绍。本节将会从10个方面为大家详细解剖PXI机箱。 PXI槽位序号 每一个PXI槽位都有一个对应的槽位号(大部分情况下)被标注在PXI插槽下方。一般为从左到右排列。 图1.3…

经典大脑解剖网站大全

本文首发在个人博客上&#xff08;7988888.xyz&#xff09;&#xff0c;此文章中所有链接均通过博客进行访问。 根据互联网公开资源&#xff0c;整理了部分大脑解剖学习资源网站&#xff0c;仅供学习参考。 在脑科学的研究中&#xff0c;大脑解剖学知识的了解是必不可少的&am…

视网膜生理解剖

Cornea&#xff1a;角膜 Pupil&#xff1a;瞳孔 Lris&#xff1a;虹膜 Lens&#xff1a;晶状体 Retina&#xff1a;视网膜 Macula&#xff1a;黄斑 Optic nerve&#xff1a;视神经 视网膜&#xff08;retina&#xff09;居于眼球壁的内层&#xff0c;是一层透明的薄膜。视网膜…

Maven仓库解剖

介绍 分类 项目从仓库找包顺序 各个仓库的介绍 本地仓库 私服 nexus私服 阿里云云效制品仓库 中央仓库 公共仓库 演示 介绍 所谓的maven仓库&#xff0c;其实就是存放各个依赖包的文件夹&#xff0c;maven不仅是构建工具和依赖管理工具以及项目信息管理工具&#xff…

冠状动脉解剖(CTA)

以下的认知&#xff0c;也是通过其他的文章东挪西凑出来的&#xff0c;结合自己的理解归纳一下。后续还会更正&#xff0c;也望大家指正。 1 基本概念 左冠状动脉&#xff08;Left Coronary artery&#xff09; 左冠状动脉主干&#xff1a;Left Main Artery&#xff08;LM&a…