2025深大电协软件部招新个人题解(部分)

news/2025/10/20 12:05:47/文章来源:https://www.cnblogs.com/Miya555/p/19152355

2025深大电协软件部招新个人题解(部分)

Miya555忙里偷闲凑出三个小时参与了此次比赛(?),后面题絮絮叨叨的没时间看了,练练手。

前言:ACM赛制,我的完成度(9/15),题目大部分要么小清新,要么套路,洛谷难度来看红到紫都有,基本以橙黄题为主。最后一题出现了主席树,可爱捏,被我一眼丁真然后跳过了。

不过这份题目放在大一来招新有点超标了吧,我感觉对初学者太不友好了。虽然我不是初学者。

image

image

题解部分

A0无畏契约的ACS之谜

签到题,a+b problem四舍五入版

#include<bits/stdc++.h>
using namespace std;
long long n,a,b,c;
long long tmp,tot;
int main()
{cin>>n;for(long long i=1;i<=n;i++){cin>>a>>b>>c;tot+=a*150+b*25+c*50;if(a>1){tot+=30*(a-1);}}
//	tmp=0;cout<<tot/n;	return 0;
}

A1尾巴的自我复制

这道题是一个小清新字符串,使用string的小巧思很快解决。

我一开始想成了回文串,手推了一下发现不对,可以直接用substr暴力拆开,两层for循环搞定,一开始还以为会超时,这个数据放的也太松了。

如果我是万恶的出题人,我将严卡TLE

image

#include<bits/stdc++.h>
using namespace std;int main() {string s;cin >> s;int n = s.length();for (int len = 1; len <= n; len++) {bool valid = true;for (int i = len; i < n; i += len) {string cur = s.substr(i, len);string tmp = s.substr(0, len); if (cur != tmp) {      string re = tmp;reverse(re.begin(), re.end());if (cur != re) {valid = false;break;}}}if (valid) {cout << len << endl;return 0;}}//  cout << n << endl;return 0;
}

A2 圣遗物词条

image

一开始读题感觉很数学,所以直接开始推式子,兜兜转转通过加加减减发现了神秘的状态转移:

f[i][j] 为把 i 拆分为 j 个数的方案数,则

\[f[i][j]=f[i-1][j-1]+f[i-j][j] \]

这是一个十分重要的表达式,有些难以理解,我画了一下:

67a3996549a2f794c594ce9d5267cb63

确实很有意思,推完之后茅塞顿开,高中的时候教练好像讲过?

后面的代码就很简单了

#include<bits/stdc++.h>
using namespace std;
int f[1010][1010];
//我服了吧,居然是dp,我怎么这么蠢了?
int main() {int n, m;cin >> n >> m;// 初始条件:0拆分为0个数,1种方式f[0][0] = 1; for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {if (i >= j) {f[i][j] = f[i - 1][j - 1] + f[i - j][j];}}}cout << f[n][m] << endl;return 0;
}

A3 爬楼梯的修行

就是你知道的那个爬楼梯的小变式题。。难度上不到普及-

变处在于 “一步可以跨M级台阶”

在for循环中再做m次加法就可以了

image

#include<bits/stdc++.h>
using namespace std;
int n,m,f[100010],tmp=1;
const int N=114514;
int main()
{
//	f[1]=1,f[2]=2;cin>>n>>m;for(int i=1;i<=m;i++){f[i]=tmp;tmp+=f[i];tmp%=114514;}for(int i=m+1;i<=n;i++){for(int j=1;j<=m;j++){f[i]+=f[i-j];f[i]%=114514;}//	f[i]=f[i-1]+f[i-2];}cout<<f[n];return 0;
}

不过我当时傻了还弄了个预处理,第一个for循环可以直接使用第二个来代替。代码更少。

A4 门扉前的弈局

image-20251020114133085

刚刚看到这道题以为是过河卒,后面发现又没那么相似。

思路是BFS,一步一步扩展。

先使用两个数组来存储上下前后的位置,用队列来维护坐标

这道题要比较细心!

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int n, m, x, y;
int f[500][500]; // 存储到达每个点的最短步数
// 骑士的8个移动方向:(+1,+2), (+1,-2), (-1,+2), (-1,-2), (+2,+1), (+2,-1), (-2,+1), (-2,-1)
int dx[8] = {1, 1, -1, -1, 2, 2, -2, -2};
int dy[8] = {2, -2, 2, -2, 1, -1, 1, -1};int main() {cin >> n >> m >> x >> y;// 初始化:所有点初始为“不可达(INF)”for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {f[i][j] = INF;}}f[x][y] = 0; // 起点步数为0queue<pair<int, int>> q;q.push({x, y}); // 起点入队while (!q.empty()) {auto [i, j] = q.front();q.pop();// 遍历8个方向for (int k = 0; k < 8; k++) {int ni = i + dx[k];int nj = j + dy[k];// 检查新位置是否在棋盘内,且未被访问过(或能更新为更短步数)if (ni >= 1 && ni <= n && nj >= 1 && nj <= m && f[ni][nj] == INF) {f[ni][nj] = f[i][j] + 1; // 步数+1q.push({ni, nj});        // 新位置入队,继续扩展}}}// 输出结果:INF改为-1,然后按格式输出for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (f[i][j] == INF) f[i][j] = -1;cout << f[i][j] << ' ';}cout << endl;}return 0;
}

A5 大小姐的古怪拆分

拆解最大素数因数,求最小素数因数就好了。点击即送,也是签到题。

#include <bits/stdc++.h>
using namespace std;
int main() {int a;cin >> a;for (int i = 2; i <= a; i++) if (a % i == 0) { cout << a / i;break;}return 0;
}

B0 四则运算进阶

做复杂了,想了一个类似于括号匹配的解法,用栈来维护字符串。

绝对不是正解但是也AC了。

image-20251020115026740

#include<bits/stdc++.h>using namespace std;
//我用栈写的,类似括号匹配的思路。
//怎么写的这么复杂
//为什么通过率这么高??
//输入的读取好像有点问题,还在调试
int priority(char op) {if (op == '+' || op == '-') return 1;if (op == '*' || op == '/') return 2;return 0;
}void calculate(stack<double>& nums, stack<char>& ops) {if (nums.size() < 2 || ops.empty()) return; // 确保栈有足够元素double b = nums.top(); nums.pop();double a = nums.top(); nums.pop();char op = ops.top(); ops.pop();double res;switch (op) {case '+': res = a + b; break;case '-': res = a - b; break;case '*': res = a * b; break;case '/': if (b == 0) { res = 0; } else {res = a / b; }break;}nums.push(res);
}double evaluate(const string& s) {stack<double> nums;stack<char> ops;int i = 0;int n = s.size();if (n == 0) return 0; // 空表达式直接返回0while (i < n) {if (s[i] == ' ') {i++;continue;}if (s[i] == '+' || s[i] == '-') {bool isNegative = (s[i] == '-');// 负号if (isNegative && (i == 0 || s[i-1] == '(' || s[i-1] == '+' || s[i-1] == '-' || s[i-1] == '*' || s[i-1] == '/')) {i++;double num = 0.0;bool hasDot = false;double fraction = 0.1;// 提取while (i < n && (isdigit(s[i]) || s[i] == '.')) {if (s[i] == '.') {if (hasDot) break; // 避免多个小数点(如1.2.3)hasDot = true;i++;continue;}if (!hasDot) {num = num * 10 + (s[i] - '0');} else {num += (s[i] - '0') * fraction;fraction *= 0.1;}i++;}nums.push(isNegative ? -num : num);continue;}// 加减while (!ops.empty() && ops.top() != '(' && priority(ops.top()) >= priority(s[i])) {calculate(nums, ops);}ops.push(s[i]);i++;} // 提取正数或小数else if (isdigit(s[i]) || s[i] == '.') {double num = 0.0;bool hasDot = false;double fraction = 0.1;while (i < n && (isdigit(s[i]) || s[i] == '.')) {if (s[i] == '.') {if (hasDot) break; // 避免多个小数点hasDot = true;i++;continue;}if (!hasDot) {num = num * 10 + (s[i] - '0');} else {num += (s[i] - '0') * fraction;fraction *= 0.1;}i++;}nums.push(num);} // 左括号直接入栈else if (s[i] == '(') {ops.push(s[i]);i++;} // 计算到左括号为止else if (s[i] == ')') {// 只计算到左括号while (!ops.empty() && ops.top() != '(') {calculate(nums, ops);}if (!ops.empty()) { // 确保栈非空再弹左括号ops.pop(); }i++;} // 乘除else if (s[i] == '*' || s[i] == '/') {while (!ops.empty() && ops.top() != '(' && priority(ops.top()) >= priority(s[i])) {calculate(nums, ops);}ops.push(s[i]);i++;} else {// 忽略非法字符i++;}}// 剩余操作符while (!ops.empty()) {calculate(nums, ops);}// nums非空return nums.empty() ? 0 : nums.top();
}int main() {int t;cin >> t;// 搞了半天,太恶心了cin.ignore(numeric_limits<streamsize>::max(), '\n');while (t--) {string s;getline(cin, s);// 去除#if (!s.empty() && s.back() == '#') {s.pop_back();}// 计算并输出结果double result = evaluate(s);printf("%.4lf\n", result);}return 0;
}

B1 帮帮14行诗

image-20251020115130751

小清新贪心题

我写这道题的时候边界判断反复出问题,导致WA了好多次。警钟敲烂。

m[i] 为i点平衡伞数,f[i] 为i点的方案数,简单贪一下就OK了,自己看吧

#include<bits/stdc++.h>
using namespace std;
long long n,m[1000010],f[1000010];
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>m[i];f[i]=0x3f3f3f3f;}f[1]=0;	for(int i=1;i<=n;i++){if((i+m[i])<=n){for(int j=i;j<=i+m[i];j++){//if(w[j]!=0)f[j]=min(f[i]+1,f[j]);}//f[i+m[i]]=min(f[i]+1,f[i+m[i]]);}else{for(int j=i;j<=n;j++){//if(w[j]!=0)f[j]=min(f[i]+1,f[j]);}//	f[n]=min(f[i]+1,f[n]);}}cout<<f[n];return 0;
}

B4 今州城改造计划

招新就上图论吗,有意思。

image

image

image-20251020115747510

思路是Dijskra,随处优化,我写最简单的Dijskra只能获得50pts。唉。

#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int MAXN = 1e5 + 5;
const int MAXM = 2e5 + 5;
const ll INF = LLONG_MAX;struct Edge {int to, w, next;
} edges[MAXM * 2];
int head[MAXN], idx = 0;ll dist[MAXN];
int N, M, C;
vector<pair<ll, int>> edge_info;
vector<ll> prefix_sum;void add_edge(int u, int v, int w) {edges[idx].to = v;edges[idx].w = w;edges[idx].next = head[u];head[u] = idx++;edges[idx].to = u;edges[idx].w = w;edges[idx].next = head[v];head[v] = idx++;
}void dijkstra() {priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;fill(dist, dist + MAXN, INF);dist[1] = 0;pq.emplace(0, 1);while (!pq.empty()) {auto [d, u] = pq.top();pq.pop();if (d > dist[u]) continue;for (int i = head[u]; i != -1; i = edges[i].next) {int v = edges[i].to;int w = edges[i].w;if (dist[v] > dist[u] + w) {dist[v] = dist[u] + w;pq.emplace(dist[v], v);}}}
}int main() {//加速加速加速加速ios::sync_with_stdio(false);cin.tie(nullptr);fill(head, head + MAXN, -1);cin >> N >> M >> C;for (int i = 0; i < M; ++i) {int A, B, D;cin >> A >> B >> D;add_edge(A, B, D);}dijkstra();edge_info.reserve(M);for (int i = 0; i < idx; i += 2) {int A = edges[i].to;int B = edges[i ^ 1].to;int D = edges[i].w;ll max_d = max(dist[A], dist[B]);edge_info.emplace_back(max_d, D);}sort(edge_info.begin(), edge_info.end());prefix_sum.resize(M + 1, 0);for (int i = 0; i < M; ++i) {prefix_sum[i + 1] = prefix_sum[i] + edge_info[i].second;}vector<ll> dists;for (int i = 1; i <= N; ++i) {dists.push_back(dist[i]);}sort(dists.begin(), dists.end());dists.erase(unique(dists.begin(), dists.end()), dists.end());ll min_total = LLONG_MAX;for (ll X : dists) {auto it = upper_bound(edge_info.begin(), edge_info.end(), make_pair(X, INT_MAX));int cnt = edge_info.end() - it;ll repair = prefix_sum[M] - prefix_sum[M - cnt];ll total = C * X + repair;if (total < min_total) {min_total = total;}}cout << min_total << endl;return 0;
}

本人能力受限只能写这么多了,剩下的题没写出来qwq

深大还是有很多大佬在的,膜拜。

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

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

相关文章

2025 硅钢片实力厂家最新推荐榜:聚焦 400 万只产能与 0.3mm 精度,解析专利技术与上市公司合作背景

引言 在新能源汽车、5G 新基建、医疗设备等高端制造领域加速迭代的当下,硅钢片作为核心电磁部件,其性能直接决定终端设备的能效与稳定性。然而行业供需矛盾与品质乱象凸显:部分企业产能不足导致批量订单交付延迟,工…

2025 年铁芯源头厂家最新推荐排行榜:精准工艺 + 全场景适配实力甄选,年销 400 万只 + 优质企业权威盘点环形铁芯/互感器铁芯厂家推荐

引言随着工业制造升级与新能源产业高速发展,铁芯作为变压器、传感器、仪器仪表等核心设备的关键部件,其质量直接决定下游产品稳定性与能效。当前铁芯市场厂家混杂,部分厂商工艺落后导致产品尺寸误差大、性能波动明显…

MATLAB实现DLT645协议

MATLAB实现DLT645协议,包含报文解析、数据校验和串口通信模块,支持读写操作和异常处理:一、核心函数模块 1. 报文结构定义 % DLT645协议帧结构 const START_BYTE = 0x68; % 起始符 const END_BYTE = 0x16; …

Maui 实践:让 JavaScript 的 this 怪物如同邻居家(强类型)的乖孩子

Maui 实践:让 JavaScript 的 this 怪物如同邻居家(强类型)的乖孩子 原创 夏群林 2025.10.20 MAUI,不能不说,好。也不得不说,好——多坑。 指望一个 Windows 平台当家的大厂,把自家与 Windows 平台深度绑定的 .N…

[251020 699mAh] 模拟赛破防有感 2.0

我会 T1 了。 我会 T2 了。 但是是个看起来细节非常多需要各种分奇偶性讨论的用 set 平衡树状物维护的东西。 我会 T3 了。 我不会 T4。 写一下 T3 看看。样例过不去。好像假了。 我刷新了。 题目不存在。 我草 T3 T4 …

2025 年速冻机源头厂家最新推荐榜单:涵盖隧道式、大型、全自动、螺旋、箱式柜式小型等多类型设备,助力食品加工企业选优质供应商

当前食品加工行业对速冻机的需求日益多元化,从隧道式、大型液氮速冻机到全自动、螺旋及箱式柜式小型速冻机,不同规模企业有着差异化采购需求。但市场上供应商鱼龙混杂,部分非源头厂家加价倒卖、技术实力薄弱的企业产…

2025 年最新钙片厂家推荐榜单:聚焦四期临床实证与蓝帽认证,为中老年骨健康精选优质品牌指南

引言当前人口老龄化进程加快,中老年群体对骨健康重视程度与日俱增,钙片市场需求随之攀升,但市场乱象却让消费者陷入选择困境。众多品牌混杂,部分产品成分含量不达标、配方缺乏科学性,且无权威临床数据支撑,仅靠宣…

基于瑞萨R7F0C807的无线充电发送器设计

一、硬件架构设计 1. 主控模块MCU选型:R7F0C807(RL78内核,20MHz主频,8KB Flash) 核心功能: 定时器阵列(TAU)生成PWM驱动信号(131kHz5%) 12位ADC实时监测电流/电压(精度1.5%) 内置看门狗定时器(WDT)防止程…

2025 年冷却塔源头厂家最新推荐排行榜:无风机无填料节能型设备领衔,优质品牌深度解析

引言当前工业领域对冷却设备的节能性、稳定性与运维成本要求日益严苛,传统风机填料冷却塔能耗高、维修频繁、更换成本高的问题愈发凸显,且国家低碳节能政策持续推进,企业亟需适配的高效冷却解决方案。为帮助工业企业…

AtCoder Beginner Contest 428 D - 183184

该算法高效解决了在给定范围[1, D]内寻找所有满足条件的x,使得数字C与C+x字符串拼接后形成的数字为完全平方数的问题。其核心创新在于通过数学建模将字符串拼接问题转化为平方数区间计数问题,避免了暴力枚举的低效做…

2025 年广州装修公司最新推荐排行榜:涵盖花都、黄埔、天河等十区,精选全品类商业空间装修优质品牌从化/越秀/荔湾/番禺/白云/增城装修公司推荐

当前广州装修市场鱼龙混杂,不少装修需求者在选择时屡屡碰壁 —— 设计方案缺乏个性且不贴合实际使用场景、施工质量差导致后期问题频发、工期延误影响开业或入住、合规性不足面临整改等问题层出不穷。为帮助广州花都、…

【Docker项目实战】启用Docker部署WikiDocs文档管理工具

【Docker项目实战】启用Docker部署WikiDocs文档管理工具pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

人狗大战:面向对象关系详解

人狗大战:面向对象关系详解 好的,让我们用一个有趣的"人狗大战"例子来详细说明各种面向对象关系。 类与类之间的关系继承/泛化 (Inheritance)class Animal:"""动物基类"""d…

2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购全攻略分析

一、引言 在精密制造、半导体、光学镜片、珠宝首饰乃至汽车零部件等行业,超声波清洗已成为保障良品率与表面洁净度的关键工序。对于产线升级或新建工厂的采购负责人、工艺工程师以及质量经理而言,如何在预算可控的前…

2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购全攻略。

一、引言 在精密制造、半导体、光学镜片、珠宝首饰乃至汽车航空等领域,清洗环节直接决定后续工艺良率与产品寿命。对于产线采购负责人、工艺工程师以及计划升级清洗工序的中小企业主而言,如何在保证洁净度的同时控制…

微服务,Spring Cloud 和 Eureka:服务发现工具 - 教程

微服务,Spring Cloud 和 Eureka:服务发现工具 - 教程2025-10-20 11:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; d…

2025年10月超声波清洗机厂家推荐榜:十强对比评测与选购指南。

一、引言 超声波清洗技术凭借高效、无损、环保的优势,已成为电子、光学、半导体、精密五金等行业提升良率、降低人工成本的必备工艺。对于计划升级产线、替换老旧设备或首次采购的创业者、工艺工程师、采购经理而言,…

2025年10月中国数据库排行榜:PolarDB重回榜眼,TDSQL跃进前五

10月墨天轮排行榜解读已出炉!本月共有170款数据库参与排名,榜单前十竞争激烈,OceanBase再次领跑、PolarDB重回榜眼、TDSQL 跃进前五,此外还有一些在产品技术/生态/产业落地上持续发力,欢迎一起盘点~10月墨天轮社区…

docker镜像搬运命令

save命令: 将mysql这个image保存到目录/home/data,保存为mysql.tar docker save -o /home/data/mysql.tar mysql load命令: 将/home/data/mysql.tar 镜像拉到本地。 docker load -i /home/data/mysql.tar

本土化DevOps平台崛起:Gitee如何重塑企业研发效能新范式

本土化DevOps平台崛起:Gitee如何重塑企业研发效能新范式 在数字化转型浪潮席卷全球的当下,企业研发效能已成为决定商业竞争力的关键因素。Gitee DevOps平台凭借其独特的本土化优势,正在成为中国企业提升研发效率的战…