自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(378)
  • 收藏
  • 关注

原创 独立游戏《Project:Survival》UE5C++开发日志0——游戏介绍

该游戏是《星尘异变》团队的下一款作品,太空科幻题材的生存游戏,我将负责使用C++、蓝图实现游戏的基础框架和核心功能,其中还包含使用人工智能算法助力游戏开发或帮助玩家运营

2024-09-23 20:58:17 560

原创 独立游戏《星尘异变》UE5 C++程序开发日志8——实现敏感词过滤功能(AC自动机)

一、敏感词词典的处理二、搭建AC自动机1.自动机节点的数据机构2.加载词典3.建立字典树4.建立失配指针三、替换字符串中的敏感词。在游戏中经常会有需要玩家输入一些内容的功能,例如聊天,命名等,这款游戏只有在存档时辉用到命名功能,所以这个过滤也只是一个实验性的功能,我们将使用AC自动机来实现,这是在我们把“csdn”这个词设置为屏蔽词后的效果

2024-07-24 16:34:15 1301

原创 独立游戏《星尘异变》UE5 C++程序开发日志7——实现加载界面

一、创建自定义AssetManager类二、异步加载资产三、加载界面UI的实现1.UI布局2.在打开关卡前和进入关卡后创建UI并统计进度有时可能会遇到关卡已经进去但依然会卡顿一段时间的情况,所以我们需要在进入关卡后,玩家可以操作关卡之前,对关卡内的资产和一些重要的资产进行加载,同时为了尽可能加载完全进行一些伪加载,加载界面效果如下

2024-07-19 16:45:55 903 1

原创 独立游戏《星尘异变》UE5 C++程序开发日志6——实现存档和基础设置系统

一、存档类1.创建一个SaveGame类2.存储关卡内数据3.加载关卡数据4.关于定时器5.存储全局数据6.加载全局数据二、存档栏1.存档栏的数据结构2.创建新存档3.覆盖已有存档4.删除存档三、游戏的基础设置1.存储游戏设置的数据结构2.初始化设置3.修改设置本篇日志将会介绍如何实现一个模拟经营游戏中的存档系统以及能够调整游戏画质分辨率等的游戏设置菜单,

2024-07-17 16:41:44 1432

原创 独立游戏《星尘异变》UE5 C++程序开发日志5——实现物流系统

一、路径计算二、包裹1.包裹的数据结构2.包裹在场景中的运动三、道路1.道路的数据结构2.道路的建造3.道路的销毁4.某个有道路连接的建筑被删除作为一个工厂类模拟经营游戏,各个工厂之间的运输必不可少,本游戏采用的是按需进口的模式,工厂之间可以建立类似于传送带一样的直连道路,每个工厂根据自身当前缺少的所需物品,按照从近到远的顺序依次访问能够生产该物品的工厂,然后收到出口订单的工厂会发出包裹,沿着玩家建设的道路送达发出进口需求的工厂,玩家可以手动配置进出口清单,也就是工厂

2024-07-17 11:30:19 945

原创 使用高斯混合模型(GMM)进行猫狗音频聚类(Kaggle Audio Cats and Dogs)

数据集包括164个标注为猫的.wav文件,总共1323秒和113个标注为狗叫声的.wav文件,总共598秒,要求判别每个音频是狗叫还是猫叫

2024-06-18 20:37:28 895

原创 DenseNet完成Cifer10任务的效果验证

DenseNet的参数效率确实比DenseNet,可以从运行时的程序内存占用大概看出来(PythonApplication9在运行ResNet18,PythonApplication8在运行DenseNet18)本文章是针对论文《2017-CVPR-DenseNet-Densely-Connected Convolutional Networks》中实验的复现,使用了相同的超参数。

2024-06-16 18:18:10 352

原创 独立游戏《星尘异变》UE5 C++程序开发日志4——实现任务系统及随机事件

本游戏作为工厂游戏,任务系统的主要功能就是给玩家生产的目标和动力,也就是给玩家发布一个需要一定数量某星尘的订单,玩家提交需要的星尘后会获得奖励,一些任务完成后就能获得随机的事件来给天体上buff,还有诸如在一个随机的合法位置生成一个Actor的事件,一、任务的数据结构二、任务栏1.任务栏数据结构2.任务进度的更新三、随机事件奖励1.随机事件的结构2.随机事件池的初始化3.生成随机事件4.计算随机奖励的概率分布5.在一个合理的随机位置生成一个actor

2024-06-06 19:07:43 1330

原创 独立游戏《星尘异变》UE5 C++程序开发日志3——实现一个库存组件

本篇日志中,我将会介绍如何实现一个有格子,每个格子有容量的物品库存,如下图:

2024-05-13 23:20:20 586

原创 独立游戏《星尘异变》UE5 C++程序开发日志0——游戏介绍

星尘异变》是一款由来自中国传媒大学的6名在校学生制作的一跨能独立游戏,在游戏中,玩家需要扮演一个宇宙中的“神”,开采宇宙中分布在“星云”内部的“星尘”,消耗“星尘”来建造“天体”作为生产更多“星尘”以及产生其他效果的的工厂,完成各种任务的同时,妥善经营所有的“天体”使“熵增”不要达到上限,否则游戏会直接结束,每完成一定量的任务,主星都会发生“进化”,解锁包括物流系统等新的功能,使主星进化到最终阶段来通关当前关卡。游戏预计将登陆steam平台。

2024-05-13 11:43:13 454

原创 Tree Cutting Codeforces Round 936 (Div. 2) 1946C

那么很容易想到的就是进行dfs,后序维护当前点u的子树大小siz[u],如果siz[u]>=x,那么这个点和它父节点之间的边就要断掉,使用的边的数量tot+1,然后令siz[u]=0,使其不影响后序的dfs过程,但如果当前点时根节点也就是1号点,它没有父节点,所以tot不能+1,而且如果以1为根的子树的大小=x。那么接下来考虑在确定了某个x的情况下求需要移除的最少边数,因为按照上面的单调性,移除的边数越少x越大。

2024-03-25 11:36:42 347

原创 小苯的三元组 2024年中国传媒大学程序设计大赛

因为lcm(a,b)=b,所以a是b 的因数,因为gcd(b,c)=b,所以c是b的倍数,那么我们如果知道b有多少个因数在数组中,记为cnt1[b],有多少个倍数在数组中,记为cnt2[b],那么以b作为三元组中间的那个数时就有cnt1[b]*cnt2[b]个合法三元组。题目大意:给出一个n个数的数组,问有多少个三元组(a[i],a[j],a[k])满足lcm(a[i],a[j])

2024-03-21 11:56:58 328

原创 Tree Compass Codeforces Round 934 (Div. 2) 1944E

我们操作4 1 、4 3、5 1、5 3,只需要4次,如果只操作一个中点就需要5次,少一次的原因是我们每次操作都涂黑了至少2个点,只操作一个中点 的话必然会有只涂黑一个点的操作,而要想每次操作都涂黑至少两个点也需要直径的点数是4的倍数,这样才能两个中点交叉操作,所以只需要分两类讨论即可。思路:要想操作数最少,就要使每次操作涂黑的点的数量尽可能多,那么也就是要找这棵树的中心点,而这样的点一定在树的直径上,也就是树上的最长链,直径可以通过两次bfs找最远点或者一次树上dp来找,这里只讲树上dp做法。

2024-03-21 11:07:00 500

原创 Tandem Repeats? Educational Codeforces Round 163 (Rated for Div. 2) 1948D

假设我们已经确定了当前要匹配的str的长度为len,那么要做的就是当前位置i和i+len的位置进行匹配,如果能匹配就就分别后移两个指针,直到匹配的字母数等于len,如果不匹配,因为要匹配的位置都是固定好的,所以下一个要匹配的位置就是失配位置的下一个位置。题目大意:给出一个字符串s,s中可能存在能代表任意字母的?思路:要找这样的合法子串相当于找一个长度为len子串str,使得这个子串,后面的len个字母组成的字符串和str相同,所以我们首先要确定的就是这样的Str的长度。2

2024-03-16 14:04:55 594

原创 独立游戏《星尘异变》UE5 C++程序开发日志2——实现一个存储物品数据的c++类

在本篇日志中,我将会介绍游戏内最基础的物品:“星尘”数据类的实现,其中包括UCLASS,USTRUC的实现,以及FName,FStriing,FText的区别和转换,TArray,TMap的使用,UENUM的实现,TSharedPtr的实现,数据表格DataTable的读取

2024-03-03 23:23:46 984

原创 独立游戏《星尘异变》UE5 C++程序开发日志1——项目与代码管理

本日志系列将会向大家介绍在《星尘异变》这款模拟经营游戏,在开发时用到的与C++相关的泛用代码与算法,主要记录UE5C++与原生C++的用法区别,以及遇到的问题和解决办法,因为这是我本人从ACM退役以后第一个从头开始的项目,所以如果有问题,欢迎大家移除交流。本游戏预计日后将会在steam平台上线,敬请期待。本篇日志将会介绍在床架一个UE5空白项目后,如何生成对应的VS文件和管理相应的文件。

2024-03-03 00:13:49 1088

原创 Good Trip Codeforces Round 921 (Div. 2) 1925D

然后从2到k枚举每个匹配对被选中的次数i,被选中i次的累计贡献为(0+i-1)*i/2,因为每次被选中的概率psel独立等概符合二项分布,所以被选中i次的概率为C(i,k)*(psel)的i次方*(1-psel)的k-i次方,再乘以m,将所有贡献相加,注意预处理逆元和取模即可。考虑怎么算初始贡献的期望,每个匹配对被选中的概率psel=1/C(2,n),k轮中被选中的次数的期望就是k/C(2,n),再乘以贡献z,z*k/C(2,n)就是单个匹配对初始贡献的期望,可以O(m)的时间求出。

2024-01-29 16:17:36 540

原创 Did We Get Everything Covered? Codeforces Round 921 (Div. 2) 1925C

因为每个合法段中可能夹杂着其他的字母,比如k=3时aabbcc是一个合法段,那么要排除多余字母的影响,就应该选取这个合法段中最后一个字母加入到反例中。当n等于2时,k个字母各出现一次后,所有字母还要再出现一次,所以最短的合法字符串就是前后各一个合法段拼在一起,每个合法段内部的字母顺序不影响。同理,n等于几就要有几个合法段。那么我们可以尝试在s中找合法段,每当k个字母都至少出现一次就是一个合法段,如果找到了n个合法段,就是YES,否则就是NO,然后考虑怎么找反例。1

2024-01-28 16:28:14 801

原创 A Balanced Problemset? Codeforces Round 921 (Div. 2) 1925B

思路:我们设n个数的公因数是y,那么这n个数都应该是y的倍数,也就是y*n应该=n的最大的因数即可。题目大意:给出一个整数x,要求将x分成n份,使得所有份的最大公因数最大,求这个最大的最大公因数。

2024-01-28 15:39:50 566

原创 Add, Divide and Floor Educational Codeforces Round 158 (Rated for Div. 2) C

思路:因为要让所有数都一样,那肯定让所有数都变成原数组中的数能使操作次数最少,那么我们不妨让所有数都变成数组中的最小数,这样我们就要让每次操作的x,这样对于每个数,它的操作次数就是log2(a[i]-x),所以我们先找到最小值,然后每遍历一个数,就求出它需要变成最小值的操作次数即可。题目大意:有一个长度为n的数组a,每次操作可以选择一个数x,对于所有的i属于1到n,令a[i]=(a[i]+x)/2,要求令所有数都相等,问需要的最小操作次数是多少。

2023-12-15 16:50:13 449

原创 Colorful Grid Codeforces Round 910 (Div. 2) C

思路:首先如果要从(1,1)走到(n,m),最短路径上的线段数len=n-1+m+1,如果k

2023-12-14 20:23:45 530

原创 Chip and Ribbon Educational Codeforces Round 158 (Rated for Div. 2)

可以发现每一块积木刚好用一次操作1即可,操作2实际上就是从一个积木转移到另一个,那么操作2的次数其实就是积木数-1,积木数量增加的时候,也就是a[i]值增大的时候,增加的数目就是a[i]增加的值,所以最终操作2的数量也就是max(0,a[i]-a[i-1])1.设指针当前位置为l,可以选择一个任意位置r(r>=l),使[l,r]内所有数+1。问对于一个初始有n个0的数组,最少要多少次操作2能使其等于a数组。2.将指针移动到一个任意位置,并令那个位置上的数+1。

2023-12-14 19:51:52 940

原创 Milena and Admirer Codeforces Round 910 (Div. 2) B

我们从n-1遍历到1,如果当前a[i]>a[i+1],那么这个数就应该分割cnt=a[i]/a[i+1]次,平分出来的数就是a[i]/(cnt+1),特殊的是如果能a[i]能整除a[i+1],那么整除次数要-1,当遇到a[i]=1时,再往后的数就都必须分割成1了。思路:因为要让数组变成非递减的,所以对于某个a[i],如果其>a[i+1],那么就要对其进行操作,无论最后进行几次操作,都应该满足,分出来的这些数是非递减的,最左边的数要>=再左边的一个数,最右边的数要

2023-12-13 10:37:04 503

原创 F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F

题目大意:有q次询问,每次询问给出一个数x,要求构造一棵n个点的树,使得对于每次询问,树上都有一条简单路径的长度等于x,同时每次询问前可以对树进行一次操作,即将一个点与其父节点的边断开,然后和其他一个点连边,操作后的图必须仍是一棵树。然后对于任意一个询问的数x,我们只需要把n号点连在编号x上即可,这样1到n的距离就等于x,只需维护n号点当前连在哪,如果已经连在x上了,就输出-1-1-1。

2023-11-18 14:49:38 294

原创 D. Yarik and Musical Notes Codeforces Round 909 (Div. 3) 1899D

思路:用快速幂打个表发现满足条件的a[i],a[j]要么a[i]=a[j]要么一个数等于1,另一个等于2,所以我们只需对于每个数,求出它后面有多少与它相等的数,如果是1或2再特判一下后面2或1的数量。题目大意:给出一个n个数的数组a,问有多少对i,j满足i

2023-11-18 14:34:12 271

原创 C. Yarik and Array Codeforces Round 909 (Div. 3) 1899C

思路:首先考虑忽略奇偶性限制怎么求最大子串和,首先我们初始化答案ans为数组中所有数的最大值,然后我们遍历数组同时记录当前选择子串的元素和sum,对于数组中的每一个数,如果当前的sum已经小于0了,那就重置sum为当前数,因为如果当前数为正的,显然应该直接换,如果是负的,加上只会更小,除此情况之外就直接加上当前数即可。考虑奇偶性条件,也就是当奇偶性不满足的时候,sum也要重置为当前数,因为已经不合法了,所以多加一个和前一个数记起来是偶数就重置的条件即可。

2023-11-18 14:23:04 223

原创 J. Joy of Handcraft 2020 China Collegiate Programming Contest - Mianyang Site

思路:对于一盏灯,它打开的时间段是[1,a[i]]、[2*a[i]+1,3*a[i]]...,对于m的时间内,每盏灯最多有m/a[i]/2个区间,我们对于每一个a[i],只保留一个最大的亮度值,这样最多1e5个a[i],枚举区间的复杂度是O(n*logm),然后用线段树维护最大值时间复杂度O(n*logm*logm)题目大意:有n盏灯和m秒,每盏灯会开a[i]秒然后关a[i]秒然后再开a[i]秒,依次循环,灯打开后,就会产生b[i]的亮度值,问m秒内每一秒最大的亮度值是多少。

2023-11-13 08:33:07 107

原创 D. Doremy‘s Connecting Plan Codeforces Round 906 (Div. 2)

思路:令当前已有的一个连通块为s,我们要找一个点j和s连通,那么我么肯定选择连通块中编号最小的一个点i,使i*j*c最小,如果s内的和+a[j]>=i*j*c,i和j就可以连通,既然i*j*c已经小于等于当前连通块的和,那么对于小于j的所有编号i*j*c都一定小于等于。题目大意:有一个长度为n的数组a,同时有一个n个点的图,编号与数组的编号对应,初始没有边,如果当前连通块的中a[i]的和+某一个点a[j]>=连通块的一个点i*某一个点j*c,那么就可以连通i和j,问能否使所有点在一个连通块内。

2023-11-02 13:13:33 142

原创 B. Long Legs Educational Codeforces Round 146 (Rated for Div. 2)

那么考虑x取何值时,(a-1)/x+1+(b-1)/x+1+x-1也就是(a+b-2)/x+x+1最小,我们发现此式的前一部分y1=(a+b-2)/x是单调递减的,y2=x+1是单调递增的,那么我们只要找到在哪里这两个函数的变化幅度相同,也就是求解y1=y2,移项化简得x约等于sqrt(a+b),根据a+b的范围和测试数据组数,我们从1到1e5枚举x,一定就能找到全局最小值。

2023-11-01 18:37:49 211

原创 C. Smilo and Monsters Codeforces Round 907 (Div. 2)

思路:因为大招可以花一点费用杀死很多怪,性价比肯定比普攻高,且大招一次消耗的能量越多越赚,要消耗更多的能量就要选择怪的数量尽可能多的堆施放大招,所以我们按怪的数量从小到大排序,建立双指针l=1,r=n,前面怪数量少的我们用普攻,如果当前积攒的能量达到a[r]了,就用大招消灭a[r],这样最终可能会剩余1堆,那么除去当前大招能杀死的以外,其他的一半向上取整都要用普攻,然后其余的一个大招杀掉。

2023-10-31 23:27:55 343

原创 D. Suspicious logarithms Codeforces Round 907 (Div. 2)

这时有两种情况,g(x)+1的地方也就是now*i有可能在当前枚举的区间外,这个区间的贡献就是(r-l+1)*cnt,另一种情况就是g(x)+1的地方在区间内,这个地方已知是now*i,那么这个区间的贡献就是(now*i-1-l+1)*cnt+(r-now*i+1)*(cnt+1),这样枚举i直到2的i次方大于上限R,就能得到g(x)x属于1到R的答案,我们令R=询问的r和询问的l-1,分别求出相减即可。

2023-10-31 22:21:23 448 4

原创 J. Similarity (Easy Version) 2023 Jiangsu Collegiate Programming Contest, 2023 National Invitational

思路:对于两个字符串s1,s2,令dp[i][[j]表示s1的前i个字符和s2的前j个字符中的最长公共字串的长度,遍历s1同时遍历s2,如果当前遍历到的两字符相同,那么就从两个字符串的上一个位置转移过来+1,dp[i][j]=dp[i-1][j-1]+1,否则dp[i][j]=0,dp[i][j]的最大值记为最长公共子串的长度。题目大意:有n个字符串,问这些字符串两两匹配的最长公共子串的最大长度是多少。

2023-10-26 20:19:19 187

原创 B. 看比赛 The 10th Jimei University Programming Contest

思路:因为直走最短路,所以我们把所有在最短路上的边都要选出来,建成新图,为此,首先用dijkstra求出1到n的最短路的长度,然后我们从n开始bfs,遍历相邻边,如果这条边的边权加上1到这条边起点的最短路距离等于1到这条边终点的最短路距离,那么就把这条边加到新图中,最后就会形成一个包含1到n的所有最短路的DAG。

2023-10-26 19:48:50 282 3

原创 D2. Dances (Hard Version) Codeforces Round 905 (Div. 2)

我们令a[1]=1时的答案为ans,在我们增大a[1]到m的过程中,可以发现区别就是可能之前a[1]不用删,增大后要删,那么答案相差就是0或1,且操作次数是随着a[1]增大而增加的,所以我们可以二分枚举1到m找到答案+1的位置,也就是找到一个x使得a[1]=x时得到的答案与ans不同,这样前边的数量*ans后边的数量*(ans+1)就是最终的答案。

2023-10-24 10:57:15 133

原创 D. Counting Rhyme Codeforces Round 904 (Div. 2)

思路:如果两个数能同时被一个数整除,那么这两个数的最大公因数也能被这个数整除,所以如果一个数x在a中出现或者是a中的数的倍数,那么以x为gcd的数对都是非法的,如果不存在x%a[i]=0那么以这样的x为gcd的数对都是合法的。题目大意:有一个长度为n的数组a,如果对于一个数个(a[i],a[j])满足不存在a[k]既能整除a[i]又能整除a[j],则称这个数对是合法的,求合法数对的数量。

2023-10-24 09:27:28 192

原创 C. You Are So Beautiful Codeforces Round 905 (Div. 2)

那么假如我们当前新添了一个数a[r],那么新增的合法答案计数就是a[r]为区间右端点的合法子串,也就是看1到r中有多少个l满足[l,r]是合法区间,我们发现,对于前面的一个数a[i],如果它出现了多次,那么只有第一次出现时作为区间左端点才是合法的,在后面出现时那个数都可以被第一次出现的那个数替代,所以每个位置的数的贡献也就是在它前面第一次出现的数的数量,那么每个相同的数的贡献,也就是在最后出现的那个位置之前有多少第一次出现的数。

2023-10-22 21:52:52 971

原创 C. Medium Design Codeforces Round 904 (Div. 2)

思路:我们设取得最大值的位置是i,我们要让这个最大值最大,那么所有包含这个位置的区间都要选,并设这些区间去掉重合部分后组成的大区间为[L,R],那么这个区间内最小值的取值位置一定是L或R,因为假如最小值的取值位置在LR里面,那么可以把这个位置左边或右边的区间删掉同时另一边的最大值仍然等于原来的最大值,最小值又变成了新的大区间的端点。题目大意:有一个长为m的数组初始全为0,有n个区间[li,ri],每选择一个区间就要令区间内所有数+1,要求选择一些区间,使得数组的最大值-最小值最大,求这个差值。

2023-10-22 18:15:45 576 3

原创 回文数 洛谷 - P1015

题目大意:给出一个数n和一个100位以内的n进制数s,每步操作令s=s+s的头尾翻转,问30步操作内最少多少步能将s变成一个回文数。思路:因为最多只有30步,100位数,所以模拟的时间复杂度肯定够,直接上高精度非10进制加法运算模板。2

2023-10-20 15:43:01 178

原创 H. Mad City Codeforces Round 898 (Div. 4)

所以我们先跑一个dfs找到所有环上的点,然后再以b为起点,找到b距离环上的哪个点最近,且是哪个点,然后再从a出发跑bfs找到b到那个点的距离,如果b一开始就在环上且到那个点比a更近,就有必胜策略,同时如果ab重合一定没有必胜策略。题目大意:有一个n个点的图,有n条边,西安有两个人A,B分别位于点a/b,每轮两个人同时开始向相邻点移动,问B有没有可能永远不和A汇合。思路:如果要永远不汇合,那么他们最终肯定在一个环里,而边的数量等于点数,说明图中有且只有一个环,那么B只要比A先到这个环即可。

2023-10-19 15:39:49 162

原创 F. Minimum Maximum Distance Codeforces Round 903 (Div. 3)

如上图,从4出发找到最远的点2,但右边的5距离2更远,这时候因为2已经是最靠左的一个点了,所以只要再从2再跑一遍bfs,找到的最远的点和2一定是距离最远的两个点,类似于问以哪个标记点为根,能找到根到标记点的最远距离。显然,在标记点2、4之间的点是才可能是取得最小值的点,因为如果在某一个点一段的话,这个最大值一定大于两个标记点之间的距离,而在中间的点一定都是小于这个距离的,那么在这两个点之间很显然最中间的点是取得最小值的点。

2023-10-17 16:38:28 197

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除