【科大讯飞笔试题汇总】2024-07-27-科大讯飞秋招提前批(研发岗)-三语言题解(Cpp/Java/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新 秋招笔试题
👏 感谢大家的订阅➕ 和 喜欢💗

📧 清隆这边最近正在收集近一年半互联网笔试题汇总,有需要的小伙伴可以关注 文末 公主号领取~

文章目录

        • 💡 本次的笔试难度跨度较大,前两题比较简单,最后一题需要 前缀和优化DP 解决,其中 `Python` 和 `Java` 在笔试中据说会超时
    • 😒 01.心情管理大师
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 📝 02.密码学家的挑战
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例说明
      • 数据范围
      • 题解
      • 参考代码
    • 🍿 03.魔法师的序列挑战
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入1
      • 样例输出1
      • 样例输入2
      • 样例输出2
      • 数据范围
      • 题解
      • 参考代码

💡 本次的笔试难度跨度较大,前两题比较简单,最后一题需要 前缀和优化DP 解决,其中 PythonJava 在笔试中据说会超时

在这里插入图片描述

😒 01.心情管理大师

问题描述

K小姐是一名心理咨询师,她最近在研究人们的心情变化规律。她发现,当一个人连续工作时,每天的心情指数会下降 A A A 点;而当这个人休息一天时,心情指数会上升1点。

K小姐想要帮助她的客户A先生进行心情管理。A先生目前的心情指数为0,他计划先连续工作 B B B 天,然后开始休假。K小姐想知道,从A先生开始工作到他的心情指数再次回到0,总共需要多少天。

请你帮助K小姐编写一个程序,计算出这个天数。

输入格式

第一行给出测试用例的数量 T T T

随后 T T T 行,每行给出 A A A B B B 的值,用空格分隔。

输出格式

输出 T T T 行,每行一个整数,表示对应测试用例的答案。

样例输入

2
2 3
3 1

样例输出

9
4

数据范围

1 ≤ T ≤ 100 1 \leq T \leq 100 1T100
1 ≤ A , B ≤ 1000 1 \leq A, B \leq 1000 1A,B1000

题解

  1. 计算 B B B 天工作后的心情指数变化: − A × B -A \times B A×B

  2. 计算需要多少天休息才能让心情指数回到0: A × B A \times B A×B

  3. 3总天数就是工作天数加上休息天数: B + ( A × B ) = B × ( A + 1 ) B + (A \times B) = B \times (A + 1) B+(A×B)=B×(A+1)

因此,我们可以直接用公式 B × ( A + 1 ) B \times (A + 1) B×(A+1) 计算出结果。

参考代码

  • Python
def solve():# 读取输入的 a 和 b 值a, b = map(int, input().split())# 计算并输出结果print(b * (a + 1))# 读取测试用例数量
t = int(input())
# 循环处理每个测试用例
for _ in range(t):solve()
  • Java
import java.util.Scanner;public class Main {public static void solve(Scanner sc) {// 读取输入的 a 和 b 值int a = sc.nextInt();int b = sc.nextInt();// 计算并输出结果System.out.println(b * (a + 1));}public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取测试用例数量int t = sc.nextInt();// 循环处理每个测试用例while (t-- > 0) {solve(sc);}sc.close();}
}
  • Cpp
#include <iostream>
using namespace std;void solve() {int a, b;// 读取输入的 a 和 b 值cin >> a >> b;// 计算并输出结果cout << b * (a + 1) << endl;
}int main() {int t;// 读取测试用例数量cin >> t;// 循环处理每个测试用例while (t--) {solve();}return 0;
}

📝 02.密码学家的挑战

问题描述

K小姐是一位密码学家,她最近在研究一种特殊的加密方法。这种方法将一个十进制数转换为不同进制(2 到 36 进制)的表示,其中 A 表示 10,B 表示 11,以此类推,Z 表示 35。

K小姐发现,某些数字在特定进制下的表示中只包含一个数字 1。她想知道,对于给定的十进制数 n n n,在所有 2 到 36 进制的表示中,最多可以包含多少个数字 1。

请你帮助 K小姐编写一个程序,计算出这个最大值。

输入格式

输入一行,包含一个整数 n n n 1 ≤ n ≤ 3 ⋅ 1 0 5 1 \leq n \leq 3 \cdot 10^5 1n3105),表示给定的十进制数。

输出格式

输出一行,包含一个整数,表示在 2 到 36 进制的所有表示中,数字 1 出现次数的最大值。

样例输入

4

样例输出

2

样例说明

n = 4 n=4 n=4 时,在 3 进制下表示为 ( 11 ) 3 (11)_3 (11)3,包含两个 1,这是最多的情况。

数据范围

1 ≤ n ≤ 3 ⋅ 1 0 5 1 \leq n \leq 3 \cdot 10^5 1n3105

题解

  1. 对于给定的十进制数 n n n,遍历 2 到 36 的所有进制。

  2. 对于每种进制,将 n n n 转换为该进制的表示,并统计其中 1 的个数。

  3. 记录所有进制中 1 的个数的最大值。

关键在于如何高效地进行进制转换和计数。可以使用除法和取模运算来实现进制转换,同时统计 1 的出现次数。

时间复杂度分析:对于每个数 n n n,需要尝试 35 种进制(2 到 36),每次转换的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)。因此总的时间复杂度为 O ( 35 log ⁡ n ) O(35 \log n) O(35logn)

参考代码

  • Python
def solve():# 读取输入的十进制数n = int(input())# 初始化最大1的个数为0max_ones = 0# 遍历2到36的所有进制for base in range(2, 37):num, ones = n, 0# 进行进制转换,同时统计1的个数while num:if num % base == 1:ones += 1num //= base# 更新最大1的个数max_ones = max(max_ones, ones)# 输出结果print(max_ones)# 调用主函数
solve()
  • Java
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取输入的十进制数int n = sc.nextInt();// 初始化最大1的个数为0int maxOnes = 0;// 遍历2到36的所有进制for (int base = 2; base <= 36; base++) {int num = n, ones = 0;// 进行进制转换,同时统计1的个数while (num > 0) {if (num % base == 1) {ones++;}num /= base;}// 更新最大1的个数maxOnes = Math.max(maxOnes, ones);}// 输出结果System.out.println(maxOnes);sc.close();}
}
  • Cpp
#include <iostream>
#include <algorithm>
using namespace std;int main() {int n;// 读取输入的十进制数cin >> n;// 初始化最大1的个数为0int maxOnes = 0;// 遍历2到36的所有进制for (int base = 2; base <= 36; base++) {int num = n, ones = 0;// 进行进制转换,同时统计1的个数while (num) {if (num % base == 1) {ones++;}num /= base;}// 更新最大1的个数maxOnes = max(maxOnes, ones);}// 输出结果cout << maxOnes << endl;return 0;
}

🍿 03.魔法师的序列挑战

问题描述

K小姐是一位魔法师,她最近在研究一种特殊的魔法序列。这种序列具有以下特性:

  • 序列长度为 n n n,每个元素不超过 m m m
  • 序列是非递减的。
  • 序列中所有元素的魔法异或值恰好等于 m m m

K小姐想知道有多少种不同的魔法序列满足这些条件。你能帮助她解决这个难题吗?

输入格式

输入一行,包含两个整数 n n n m m m 1 ≤ n ≤ 300 1 \leq n \leq 300 1n300 0 ≤ m ≤ 300 0 \leq m \leq 300 0m300),分别表示序列的长度和魔法异或值。

输出格式

输出一个整数,表示满足条件的魔法序列的数量。由于答案可能很大,请对 1 0 9 + 7 10^9 + 7 109+7 取模后输出。

样例输入1

3 2

样例输出1

4

样例输入2

200 200

样例输出2

391022064

数据范围

  • 1 ≤ n ≤ 300 1 \leq n \leq 300 1n300
  • 0 ≤ m ≤ 300 0 \leq m \leq 300 0m300

题解

这个问题可以使用动态规划来解决。定义状态 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k] 表示长度为 i i i,最后一个数是 j j j,异或和为 k k k 的方案数。

状态转移方程为:

d p [ i ] [ j ] [ k ] = ∑ 0 ≤ l ≤ j d p [ i − 1 ] [ l ] [ k ⊕ j ] dp[i][j][k] = \sum_{0 \leq l \leq j} dp[i-1][l][k \oplus j] dp[i][j][k]=0ljdp[i1][l][kj]

其中 ⊕ \oplus 表示异或操作。

为了优化时间复杂度,可以使用前缀和来加速计算。最终的时间复杂度为 O ( n ⋅ m 2 ) O(n \cdot m^2) O(nm2)

据考友反馈,在笔试的时候pythonjava 代码是会超时的,建议冲 cpp

参考代码

  • Python
MOD = 10**9 + 7def solve():n, m = map(int, input().split())# 初始化DP数组dp = [[[0] * (2*m+1) for _ in range(m+1)] for _ in range(n+1)]# 初始化长度为1的情况for j in range(m+1):dp[1][j][j] = 1# 动态规划过程for i in range(2, n+1):# 计算前缀和prefix_sum = [[0] * (2*m+1) for _ in range(m+1)]for j in range(m+1):for k in range(2*m+1):prefix_sum[j][k] = dp[i-1][j][k]if j > 0:prefix_sum[j][k] = (prefix_sum[j][k] + prefix_sum[j-1][k]) % MOD# 状态转移for j in range(m+1):for k in range(2*m+1):if k ^ j <= 2*m:dp[i][j][k] = prefix_sum[j][k ^ j]# 计算最终结果ans = sum(dp[n][j][m] for j in range(m+1)) % MODprint(ans)solve()
  • Java
import java.util.Scanner;public class Main {static final int MOD = 1000000007;static final int N = 301;static int[][][] dp = new int[N][N][N << 1];static int[][] prefixSum = new int[N][N << 1];public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();// 初始化长度为1的情况for (int j = 0; j <= m; j++) {dp[1][j][j] = 1;}// 动态规划过程for (int i = 2; i <= n; i++) {// 计算前缀和for (int j = 0; j <= m; j++) {for (int k = 0; k <= m * 2; k++) {prefixSum[j][k] = dp[i - 1][j][k];if (j > 0) {prefixSum[j][k] = (prefixSum[j][k] + prefixSum[j - 1][k]) % MOD;}}}// 状态转移for (int j = 0; j <= m; j++) {for (int k = 0; k <= 2 * m && (k ^ j) <= 2 * m; k++) {dp[i][j][k] = prefixSum[j][k ^ j];}}}// 计算最终结果int ans = 0;for (int j = 0; j <= m; j++) {ans = (ans + dp[n][j][m]) % MOD;}System.out.println(ans);}
}
  • Cpp
#include <iostream>
#include <vector>
using namespace std;const int MOD = 1e9 + 7;
const int N = 301;int dp[N][N][N << 1];  // DP数组,dp[i][j][k]表示长度为i,最后一个数是j,异或和为k的方案数
int prefix_sum[N][N << 1];  // 前缀和数组,用于优化计算int main() {int n, m;cin >> n >> m;// 初始化长度为1的情况for (int j = 0; j <= m; ++j) {dp[1][j][j] = 1;}// 动态规划过程for (int i = 2; i <= n; i++) {// 计算前缀和for (int j = 0; j <= m; j++) {for (int k = 0; k <= m * 2; k++) {prefix_sum[j][k] = dp[i - 1][j][k];if (j > 0) {prefix_sum[j][k] = (prefix_sum[j][k] + prefix_sum[j - 1][k]) % MOD;}}}// 状态转移for (int j = 0; j <= m; j++) {for (int k = 0; k <= 2 * m && (k ^ j) <= 2 * m; k++) {dp[i][j][k] = prefix_sum[j][k ^ j];}}}// 计算最终结果int ans = 0;for (int j = 0; j <= m; ++j) {ans = (ans + dp[n][j][m]) % MOD;}cout << ans << "\n";return 0;
}

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

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

相关文章

如何通过压缩提示降低GPT-4的成本

如果使用得当&#xff0c;LLMLingua可以降低使用高级LLM的成本&#xff0c;并使更广泛的用户和应用程序可以使用LLM。 像GPT-4和Claude这样的大型语言模型(LLM)可以通过良好的提示工程学习新任务。然而&#xff0c;较长的提示会增加使用这些模型的成本&#xff0c;并且还会减慢…

使用大型语言模型进行文档解析(附带代码)

动机 多年来&#xff0c;正则表达式一直是我解析文档的首选工具&#xff0c;我相信对于许多其他技术人员和行业来说也是如此。 尽管正则表达式在某些情况下功能强大且成功&#xff0c;但它们常常难以应对现实世界文档的复杂性和多变性。 另一方面&#xff0c;大型语言模型提供了…

vue3使用vue-i18n,调用t时指定语言获取翻译后的文本

今天碰到一个问题。就是使用i18n在调用t(‘key’)时&#xff0c;一般是直接返回当前语言文本。 比如我现在是简体。直接调用 t(‘commonBar.close’) 的话会返回简体 ‘关闭’。 但我现在这个地方返回其他语言&#xff0c;比如繁体。要怎么处理呢 查了文档&#xff0c;发现t函数…

writing classes ... [xxx of xxxx] 执行时间太长

一、问题展示 二、解决方法 打开设置【File - Settings…】修改堆大小

【C++】选择结构-多条件if语句

多条件if语句格式为 if(第一个条件) else if(若第一个条件未满足&#xff0c;执行此条件) {第二个条件满足执行此操作} else if(若第二个条件未满足&#xff0c;执行此条件) {第三个条件满足执行此操作} ...... else{若所有条件都不满足执行此操作} 下面是一个实例 #inc…

Qt基础 | 自定义界面组件 | 提升法 | 为UI设计器设计自定义界面组件的Widget插件 | MSVC2019编译器中文乱码问题

文章目录 一、自定义 Widget 组件1.自定义 Widget 子类2.自定义 Widget 组件的使用 二、自定义 Qt Designer 插件1.创建 Qt Designer Widget 插件项目2.插件项目各文件的功能实现3.插件的编译与安装4.使用自定义插件5.使用 MSVC 编译器输出中文的问题 一、自定义 Widget 组件 当…

Vue2从基础到实战(指令篇)

Vue中的常用指令&#xff01; 概念&#xff1a;指令&#xff08;Directives&#xff09;是 Vue 提供的带有 v- 前缀 的 特殊 标签属性。 vue 中的指令按照不同的用途可以分为如下 6 大类&#xff1a; 内容渲染指令&#xff08;v-html、v-text&#xff09; 条件渲染指令&…

计科录取75人!常州大学计算机考研考情分析!

常州大学&#xff08;Changzhou University&#xff09;&#xff0c;简称“常大”&#xff0c;位于江苏省常州市&#xff0c;是江苏省人民政府与中国石油天然气集团有限公司、中国石油化工集团有限公司及中国海洋石油集团有限公司共建的省属全日制本科院校&#xff0c;为全国深…

C++~~string模拟实现(3)

目录 1.传统写法和现代写法 2.对于流提取的优化 3.简单机制了解 4.string类的几个构造函数总结 4.1基本用法 4.2两个赋值方式 4.3拷贝构造 4.4获取字符 4.5一个容易混淆的对比 4.6创建对象 1.传统写法和现代写法 &#xff08;1&#xff09;上面的代码里面的左边部分是…

51单片机-第五节-串口通信

1.什么是串口&#xff1f; 串口是通讯接口&#xff0c;实现两个设备的互相通信。 单片机自带UART&#xff0c;其中引脚有TXD发送端&#xff0c;RXD接收端。且电平标准为TTL&#xff08;5V为1,0V为0&#xff09;。 2.常见电平标准&#xff1a; &#xff08;1&#xff09;TTL电…

pycharm+pytorch+gpu开发环境搭建

一、安装anacoda 1、下载Anaconda安装包 官网下载地址 https://www.anaconda.com/distribution/ 清华镜像 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载python3.8对应的版本Anaconda3-2021.04-Windows-x86_64.exe 下载完成…

Vue中常用指令简介

一. V-html 作用&#xff1a;更新元素的innerHTML&#xff0c;拥有响应式的特点&#xff0c;即数据驱动视图&#xff0c;解析标签&#xff0c;作用类似于js中获取dom对象&#xff0c;然后再进行innerHTML赋值。 展示了一下v-html解析标签的特点&#xff0c;这算是和插值表达式…

【网络安全的神秘世界】文件包含漏洞

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 一、概述 文件包含&#xff1a;重复使用的函数写在文件里&#xff0c;需要使用某个函数时直接调用此文件&#xff0c;而无需再…

【Linux】生产者消费者模型 + 线程池的介绍和代码实现

前言 上节我们学习了线程的同步与互斥&#xff0c;学习了互斥锁和条件变量的使用。本章我们将学习编程的一个重要模型&#xff0c;生产者消费者模型&#xff0c;并且运用之前学的线程同步和互斥的相关接口来实现阻塞队列和环形队列&#xff0c;最后再来实现一个简易的线程池。 …

国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理

1、假设我们从决策树生成了一个训练集&#xff0c;然后将决策树学习应用于该训练集。当训练集的大小趋于无穷时&#xff0c;学习算法将最终返回正确的决策树吗&#xff1f;为什么是或不是&#xff1f; 本次有两个参考&#xff1a; 参考一&#xff1a; 当训练集的大小趋于无穷…

普中51单片机:蜂鸣器的简单使用(十一)

文章目录 引言蜂鸣器的分类工作原理无源蜂鸣器压电式蜂鸣器&#xff1a;电磁式蜂鸣器&#xff1a; 电路符号及应用代码演示——无源蜂鸣器 引言 蜂鸣器是一种常见的电子音响器件&#xff0c;广泛应用于各种电子产品中。它们能够发出不同频率的声音&#xff0c;用于警报、提醒、…

整数二分详解【附带PPT】

#include<bits/stdc.h> using namespace std; int n,a[1001],k;int b_search1(int l,int r,int k){while(l<r){int mlr1>>1;//检查是否满足橙色性质 if(a[m]<k) lm;else rm-1;}//循环结束l和r同时指向边界 return l; }int b_search2(int l,int r,int k){whil…

【Linux】进程间通信(1):进程通信概念与匿名管道

人与人之间是如何通信的&#xff1f;举个简单的例子&#xff0c;假如我是月老&#xff0c;我要为素不相识的但又渴望爱情的男女两方牵红线。我需要收集男方的信息告诉女方&#xff0c;收集女方的信息告诉男方&#xff0c;然后由男女双方来决定是否继续。对于他们而言&#xff0…

Python | Leetcode Python题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution:def hIndex(self, citations: List[int]) -> int:n len(citations)left 0; right n - 1while left < right:mid left (right - left) // 2if citations[mid] > n - mid:right mid - 1else:left mid 1retur…

【Linux C | 网络编程】进程池大文件传输的实现详解(三)

上一篇实现了进程池的小文件传输&#xff0c;使用自定义的协议&#xff0c;数据长度数据本身&#xff0c;类似小火车的形式&#xff0c;可以很好的解决TCP“粘包”的问题。 【Linux C | 网络编程】进程池小文件传输的实现详解&#xff08;二&#xff09; 当文件的内容大小少于…