【AI/算法类】OPPO 2025届秋招笔试题(B卷)

news2024/9/23 5:29:36

目录

  • 1. 第一题
  • 2. 第二题
  • 3. 第三题

⏰ 时间:2024/08/10
🔄 输入输出:ACM格式
⏳ 时长:2h

本试卷还有选择题部分,但这部分比较简单就不再展示。

1. 第一题

小O有一个正整数 x x x,他想知道,第一个不小于 x x x 的素数是几,请你帮帮他吧。

输入描述

输入包含一行一个正整数 x   ( 1 < x < 1 0 8 ) x\,(1<x< 10^8) x(1<x<108),表示小O拥有的正整数。

输出描述

输出包含一行一个正整数,表示不小于 x x x 的最小素数。

题解

暴力遍历即可。

#include <bits/stdc++.h>

using namespace std;

bool isPrime(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) return false;
    }
    return true;
}

int main() {
    int x;
    cin >> x;
    while (!isPrime(x)) {
        x++;
    }
    cout << x << endl;
    return 0;
}

2. 第二题

小O面前有 n n n 堆糖果,编号从 1 1 1 n n n,Alice和Bob将轮流拿走编号最小的糖果堆中的所有糖果,具体的:Alice 首先会拿走第一堆,然后Bob拿走第二堆,然后Alice拿走第三堆…直到 n n n 堆糖果全都被拿完为止。

小O现在希望 Alice 和 Bob 两人的糖果数量之差尽可能小(即如果Alice糖果数量为 x x x, Bob糖果数量为 y y y,他想使得 ∣ x − y ∣ |x-y| xy 的值尽可能小),为此他可以最多提前拿走一堆糖果(当然拿走后,位于这堆糖果之后的所有糖果编号也会减一)。

请你帮他求出这个最小值吧。

输入描述

第一行输入一个整数 n   ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n\,(1\leq n\leq 2\cdot 10^5) n(1n2105) 代表糖果的堆数。
第二行输入 n n n 个整数 a 1 , a 2 , . . . , a n   ( 1 ≤ a i ≤ 1 0 9 ) a_1,a_2,...,a_n\,(1\leq a_i\leq10^9) a1,a2,...,an(1ai109) 代表每一堆糖果的数量。

输出描述

在一行上输出一个整数,代表两人糖果数量之差的最小值。

题解

在小O拿走之前,Alice的序列是1、3、5、7等,为奇数序列,Bob的序列是2、4、6、8等,为偶数序列。

考虑一个 n = 9 n=9 n=9 的简单情形,假设小O拿走第 5 5 5 个,那么剩下的糖果堆为 12346789 1 2 3 4 6 7 8 9 12346789,Alice的序列为 1368 1 3 6 8 1368,Bob的序列为 2479 2 4 7 9 2479,可以发现,以 5 5 5 为分界点,Alice的序列中 5 5 5 左边的取的都是奇数, 5 5 5 右边的都是偶数。Bob序列中 5 5 5 左边的都是偶数, 5 5 5 右边的都是奇数。即无论是Alice还是Bob,位于分界点两边的元素下标奇偶性相反。

很显然我们需要遍历小O的位置,那么留给我们处理的时间就只有 O ( log ⁡ n ) O(\log n) O(logn)了,我们可以利用「前缀和」的思想,预处理出四个数组:

  • left_odd[i] 代表的是 [1, i] 区间,所有下标为奇数的元素和。
  • left_even[i] 代表的是 [1, i] 区间,所有下标为偶数的元素和。
  • right_odd[i] 代表的是 [i, n] 区间,所有下标为奇数的元素和。
  • right_even[i] 代表的是 [i, n] 区间,所有下标为偶数的元素和。

在遍历小O的位置 i i i 时,Alice的糖果数量为 left_odd[i]+right_even[i],Bob的糖果数量为 left_even[i]+right_odd[i]

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

void find_min(int n, vector<i64>& a) {
    if (n == 1) {
        cout << 0 << endl;
        return;
    }
    if (n == 2) {
        cout << min({a[0], a[1]}) << endl;
        return;
    }

    vector<i64> left_odd(n + 2);
    vector<i64> left_even(n + 2);
    vector<i64> right_odd(n + 2);
    vector<i64> right_even(n + 2);

    for (int i = 1; i <= n; i++) {
        left_odd[i] = left_odd[i - 1];
        left_even[i] = left_even[i - 1];
        if (i % 2) left_odd[i] += a[i];
        else left_even[i] += a[i];
    }

    for (int i = n; i; i--) {
        right_odd[i] = right_odd[i + 1];
        right_even[i] = right_even[i + 1];
        if (i % 2) right_odd[i] += a[i];
        else right_even[i] += a[i];
    }

    i64 min_diff = LLONG_MAX;
    for (int i = 1; i <= n; i++) {
        i64 a = left_odd[i] + right_even[i];
        i64 b = left_even[i] + right_odd[i];
        min_diff = min(min_diff, abs(a - b));
    }

    cout << min_diff << endl;
}

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

    vector<i64> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    find_min(n, a);
    return 0;
}

3. 第三题

小O有一个数字串,小O希望把这个数字串分割成两个不含前导零的数字串,使得前半部分可以被 x x x 整除,后半部分可以被 y y y 整除。请你帮助小O找到一种分割方法。

输入描述

第一行输入一个长度不小于 2 2 2、不超过 1 0 5 10^5 105,且仅由数字字符构成的字符串 s s s
第二行输入两个整数 x x x y   ( 1 ≤ x , y ≤ 1 0 5 ) y\,(1\leq x,y\leq 10^5) y(1x,y105) 代表题中所述的除数。

输出描述

在一行上输出两个数字串 t 1 t_1 t1 t 2 t_2 t2,第一个数字串表示分割出的前半部分,第二个数字串表示分割出的后半部分,且满足 s = t 1 + t 2 s=t_1+t_2 s=t1+t2
如果不存在这样的分割方法,直接输出 − 1 -1 1
如果有多种合法答案,您可以输出任意一种。

题解

假设下标从 1 1 1 开始。

和第二题一样,同样是遍历分割的位置,我们同样要在 O ( log ⁡ n ) O(\log n) O(logn) 的时间内完成计算。如果使用py的切片计算,必然会超时。我们可以使用第二题的思想,即开一个前后缀数组。prefix[i] 代表的是 s[1..i] 构成的数字除以 x x x 的余数,suffix[i] 代表的是 s[i...n] 构成的数字除以 y y y 的余数。因此位置 k k k 是合理的分割当且仅当 prefix[k]==0suffix[k+1]==0

#include <bits/stdc++.h>

using namespace std;

void solve(string& s, int x, int y) {
    int n = s.length();
    s = " " + s;

    vector<int> prefix(n + 2);
    vector<int> suffix(n + 2);

    int cur = 0;
    for (int i = 1; i <= n; i++) {
        cur = (cur * 10 + (s[i] - '0')) % x;
        prefix[i] = cur;
    }

    cur = 0;
    int multi = 1;
    for (int i = n; i; i--) {
        cur = (cur + (s[i] - '0') * multi) % y;
        suffix[i] = cur;
        multi = (multi * 10) % y;
    }

    for (int i = 1; i < n; i++) {
        if (prefix[i] == 0 && suffix[i + 1] == 0) {
            cout << s.substr(1, i) << ' ' << s.substr(i + 1) << endl;
            return;
        }
    }

    cout << -1 << endl;
}

int main() {
    string s;
    cin >> s;

    int x, y;
    cin >> x >> y;

    solve(s, x, y);
    return 0;
}

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

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

相关文章

【机器学习】(基础篇五) —— 逻辑回归

逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广义线性模型&#xff0c;主要用于处理因变量为二分类或多分类&#xff08;通过独热编码或多输出逻辑回归&#xff09;的问题。尽管名字中带有“回归”二字&#xff0c;但实际上逻辑回归是一种分类算法&am…

SQLite数据库的增删改查(CRUD)

文章目录 SQLite数据库的增删改查&#xff08;CRUD&#xff09;添加数据更新数据删除数据查询数据使用SQL操作数据库添加数据的方法如下&#xff1a;更新数据的方法如下&#xff1a;删除数据的方法如下&#xff1a;查询数据的方法如下&#xff1a; SQLite数据库的增删改查&…

web技术1——jdk目录结构(重要),tomcat服务器(重要)

jdk文件夹结构(重要) bin目录&#xff1a; 里面都是.exe可执行文件。java&#xff0c;javac&#xff0c;javadoc&#xff0c;java编译工具&#xff0c;java监测工具等.exe文件都在这里。 include目录: 底层有用c写的东西&#xff0c;这里面包含很多c语言的文件&#xff0c…

Qt传入参数到mysql语句

试过两种方法都成功了 方法1&#xff1a;使用bool QSqlQuery::prepare和void QSqlQuery::bindValue传入参数,然后再使用bool QSqlQuery::exec() 执行Mysql语句 QSqlDatabase db //数据库 QSqlQuery result(db); // 基于已连接的数据库db建立 QSqlQuery 对象 QString strTime…

Linux du命令估算文件空间使用情况

du命令&#xff0c;估算文件空间使用情况&#xff0c;命令格式&#xff1a; du [option]... [file]... option&#xff1a; -a, --all显示所有文件的计数&#xff0c;而不仅仅是目录-d, --max-depthN打印文件夹深度小于等于N的总空间-h, --human-readable以人性化可读格式打…

Kotlin学习-01创建kotlin学习环境

安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行

类与对象(中(1))

开头 上一期内容&#xff0c;我们初步学习了类与对象中的基础知识&#xff0c;了解了类的定义&#xff0c;实例化以及this指针等相关内容&#xff0c;不知各位是否有一定的收获。今天&#xff0c;我们将更进一步&#xff0c;对类与对象中的默认成员函数部分进行一个初步的了解…

【排序篇】实现快速排序的三种方法

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1 交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本1.2.2 挖坑法1.2.3 前后指针…

C++求职LinuxWebServer面试篇(项目介绍)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

【数学建模】趣味数模问题——棋子颜色问题

问题描述&#xff1a; 在任意拿出黑白两种颜色的棋子共 n 个&#xff0c;随机排成一个圆圈。然后根据以下规则放置棋子&#xff1a; 在两颗颜色相同的棋子中间放一颗黑色棋子在两颗颜色不同的棋子中间放一颗白色棋子 放完后撤掉原来所放的棋子&#xff0c;重复以上过程&…

仿某知识蝉在线学习副业项目知识付费系统小程序源码

一、仿知识蝉知识付费系统源码简介 知识付费系统&#xff0c;集合了图文、音频、视频、直播授课&#xff0c;专栏&#xff0c;品牌商城等主流功能和付费形式&#xff0c;并且包含多种多样的营销方案和互动模块&#xff0c;打造属于自己的知识付费系统。 安装步骤&#xff1a;…

聚星文社的工具使用0.2.9版本

聚星文社是一个在线写作社区&#xff0c;提供多种工具供用户使用。以下是聚星文社的工具使用说明&#xff1a; 聚星文社的工具https://docs.qq.com/doc/DRU1vcUZlanBKR2xy 写作工具&#xff1a;聚星文社提供了一个强大的在线写作工具&#xff0c;包括富文本编辑器、字数统计、拼…

计算机毕业设计选题推荐-民宿管理系统-酒店预定系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

windows下TortoiseSVN切换账号的方法

前言 在项目开始初期的时候大家会使用一个默认账号,后面会根据需要给每个人分配各自的个人账号,这个时候就需要重登陆新的svn账号,下面就是讲解下怎样在windows下修改登录TortoiseSVN的账号。 方法 1.首先在桌面右键&#xff0c;选择TortoiseSVN-settings 2.进入设置页面&a…

Android常见的界面布局

目录 ​前言 1.线性布局LinearLayout 2.相对布局RelativeLayout 3.表格布局TableLayout 4.网格布局GridLayout 实现一个计算器界面 改Button按钮颜色 5.帧布局FrameLayout 前言 在Android应用程序中&#xff0c;界面是由布局和控件组成的。控件是功能单元&#xff0c;负…

【C++】深入探索类和对象:初始化列表及其static成员与友元

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇 本章将分享C中类和对象最后章节“深入探索类和对象&#xff1a;初始化列表及其static成员与友元”&#xff0c;希望通过这几篇关于类和对象文…

JavaScript 错误 - Throw 和 Try to Catch

try 语句使您能够测试代码块中的错误。 catch 语句允许您处理错误。 throw 语句允许您创建自定义错误。 finally 使您能够执行代码&#xff0c;在 try 和 catch 之后&#xff0c;无论结果如何。 实例 在本例中&#xff0c;我们通过 adddlert 编写警告代码来故意制造了一个…

实用库/函数之string的用法

目录 1.使用: 2.定义 3.访问(两种方式) (1)通过下标访问(像字符数组那样) (2)通过迭代器访问 4.常用函数 (1)operator+=:string的加法,将两个string直接拼接起来 (2)compare operator:两个string类型可以直接使用==、!=、<、<=、>、>=比较大…

<数据集>红绿灯识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;7884张 标注数量(xml文件个数)&#xff1a;7884 标注数量(txt文件个数)&#xff1a;7884 标注类别数&#xff1a;3 标注类别名称&#xff1a;[light_green, light_red, light_yellow] 序号类别名称图片数框数1lig…