算法笔试-编程练习-M-01-24

t这套题,偏向灵活,更多的考察了数学、贪心

一、质因数

题目描述

小乖对 gcd (最大公约数) 很感兴趣, 他会询问你t次。 每次询问给出一个大于 1 的正整数 n, 你是否找到一个数字m(2 ≤m ≤ n),使得 gcd(n,m)为素数.

注:原题为给出任意解,本题中请给出最大值作为答案

输入描述

每个测试文件将包含多组测试数据,每组测试数据的第一行包含一个整数 k (2 ≤ k ≤ 10^5), 表示有 k个待测数字.接下来 k 行,每行包含一个整数 n (2 ≤ n ≤ 10^9),表示待测的数字.

输出描述

对于每一组测试数据, 在一行上输出一个整数,代表数字 m。

示例 1

输入

2
114
15

输出

57
5

题目分析

【题目类型:数论、质数】

首先素数和质数是一个概念的两种说法。题目在描述的过程中加了几个拐弯,对于n找到一个m,使gcd(n,m)是素数,求最小的m,其实就是找n的最小质因数m。

这里我们要明确一个概念,所有合数都可以写成若干质数的乘积,所以n的质因数m一定有 m*m<n。这里有两者方案:

1)一种是由于n小于10^9所以可以求出10^5以内所有的质数,然后对于n从小到大遍历。

2)另一种是类似质因数分解的方式,去找n的质因数。

代码:

prime_numbers = []
# 因为 n 小于10^9,则其质因素一定小于10^5
for i in range(2, 100000):find = Falsefor p in prime_numbers:# 一个合数一定有比他小质因数,如果找不到,则该数就是质数if p*p > i: breakif i%p == 0:    find = Truebreakif not find:prime_numbers.append(i)k = int(input())
for _ in range(k):n = int(input())flag = Truefor p in prime_numbers:if p*p > n:breakif n % p == 0:print(p)flag = Falsebreakif flag:print(n)
# 寻找质因素
def calc(n):factor = 2if n % factor == 0:return factorfactor = 3if n % factor == 0:return factorwhile factor*factor <= n:if n % factor == 0:return factorfactor += 2 # 这里是因为已经确认 n 不会被2整除,所以只遍历奇数就可以(快一点)return n    # 能到这里说明没有找到n的质因数,那么n就是素数k = int(input())
for _ in range(k):n = int(input())print(calc(n))

补充:

作为补充理解,这里给出gcd和lcm的代码:

def gcd(n, m):while m:n, m = m, n%mreturn ndef lcm(n,m):return n*m//gcd(n,m)n = [1, 12, 6, 10, 30]
m = [3, 18, 15, 21, 20]
for i in range(len(n)):print(n[i], m[i], gcd(n[i], m[i]), lcm(n[i], m[i]))

二、极差

题目描述

小乖有一个长度为 n 的数组,每次操作可以选择两个下标i和j,分别减1和加1,小乖想知道最少需要多少次操作,可以使数组极差减小。

数组的极差为数组中最大值和最小值的差

输入描述

第一行输入一个整数 n (2 ≤ n ≤ 10^5), 表示数组的长度 第二行输入n个整数 a_1,a_2,...a_n (1 ≤ a_i ≤ 10^9), 代表数组的元素

输出描述

在一行上输出一个整数,表示最少需要多少次操作。

示例 1

输入

5
1 2 3 4 5

输出

3

题目分析

【题目类型:贪心,数学】

这是一道很直观得平均贪心题目,我们是使用下去取整获得平均数mean,那么只需要让所有数字调整为mean+1 或者mean即可。

由于mean是向下取整得到的,那么原数组中大于mean的数字到mean的差的和,一定大于小于mean的数字到mean的差的和。这个多出来的数值实际上就是mean+1是数量(也就是下面代码中diff = sum(tempList)求得的值)。我们记录大于mean的值的数量为cnt,存在如下两种情况:

1)如果diff >= cnt,那么其实就让所有大于mean的值少减1就可以了。这里的逻辑很直观,就是保证所有原来就大于mean的值为mean+1

2)else cnt>diff,那么就让大于mean的数,少减diff就可以啦。

代码:

n = int(input())
arr = [int(i) for i in input().split()]
mean = sum(arr)//ntempList = []
cnt = 0
ans = 0
for a in arr:temp = a-meanif temp>0:ans += tempcnt += 1tempList.append(temp)diff = sum(tempList)if diff >= cnt:ans -= cnt
elif diff > 1:ans -= diffprint(ans)

三、博弈

小乖和小坏在玩一个游戏,游戏中有一个长度为 n 的数组a1,a2,...,an和一个固定的整数k。游戏规则如下,双方都会执行最优策略:

第一步,小乖选择一个非空的区间 [l,r],将这个区间中的所有数字都乘上 k。

第二步, 小坏选择一个非空的区间 [l,r], 将这个区间中的所有数字都乘上 k。

记sum=整个数组的和,小坏想让sum尽可能小,小乖想让sum尽可能大,你需要求出最后 sum的值。

输入描述

第一行输入两个整数 n 和 k (-10^5≤ k ≤ 10^5, 1 ≤ n ≤ 1000),代表数组长度和固定的整数。

第二行输入 n 个整数 a1,a2,...,an(−10^5≤ai≤10^5)代表数组。

输出描述

在一行上输出一个整数表示答案。

示例 1

输入

6 2
-1 -2 -3 1 2 3

输出

0

说明

小乖会选择区间[4,6],数组变成{−1,−2,−3,2,4};

小坏会选择区间[1,3],数组变成{−2,−4,−6,2,4,6};

数组总和为 0。

题目分析

【题目类型:最大子序列和,博弈】

对于后手小坏来说,他的决策是贪心的,即为了让sum最小,当k>0时,选择最小子序列和相乘,当k<=0时,选择最大子序列和相乘。而这个问题可以用DP用O(n)的时间复杂度求解,参考算法笔试-编程练习-好题-02-CSDN博客

对于先手小乖来说,难以直接确定如何做可以让sum最大,需要遍历所有情况,检查小坏操作结束后的sum值,选择sum最大的取值。

【注意】博弈问题,通常后手是有贪心解的,但是先手的最优解难以贪心确定。

代码:

import copy
def calc_min(nums_in, k):dp = copy.deepcopy(nums_in)for i in range(1, len(nums_in)):if dp[i-1] < 0:dp[i] += dp[i-1]return sum(nums_in) + (k-1)*min(dp)def calc_max(nums_in, k):dp = copy.deepcopy(nums_in)for i in range(1, len(nums_in)):if dp[i-1] > 0:dp[i] += dp[i-1]return sum(nums_in) + (k-1)*max(dp)def calc_base(nums_in, l, r, k):nums = copy.deepcopy(nums_in)for i in range(l, r+1):nums[i] *= kreturn numsdef main_calc(nums, n, k):if k == 1:return sum(nums)ans = ""for l in range(n):for r in range(l,n):nums_temp = copy.deepcopy(nums)# 小乖:遍历nums_temp = calc_base(nums_temp, l, r, k)# 小坏:贪心if k > 0:# 找最小的区间temp = calc_min(nums_temp, k)else:# 找最大的区间temp = calc_max(nums_temp, k)if ans=="" or temp > ans:ans = tempreturn ansn, k = map(int, input().split())
nums = [int(i) for i in input().split()]
print(main_calc(nums, n, k))

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

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

相关文章

智能优化算法-北方苍鹰优化算法(NGO)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 北方苍鹰优化算法 (Northern Goshawk Optimizer, NGO) 是一种基于群体智能的元启发式优化算法&#xff0c;它模拟了北方苍鹰&#xff08;Northern Goshawk&#xff09;的捕食行为、领地行为以及社交互动&#x…

网络攻击全解析:主动、被动与钓鱼式攻击的深度剖析

在当今这个互联网高度普及与深度融合的时代&#xff0c;网络攻击&#xff0c;这一赛博空间的隐形威胁&#xff0c;正以前所未有的频率和复杂度挑战着网络安全乃至国家安全的底线。为了更好地理解并防范这些威胁&#xff0c;本文将深入剖析网络攻击的主要类型——主动攻击、被动…

2024-8-28作业C++/QT

代码&#xff1a; #include <iostream> #include <cstring> #include <array> #include <iomanip> using namespace std; int main() { //array<char,128> a; //array<char,128>::iterator iter; string str; getline(c…

小阿轩yx-Kubernertes日志收集

小阿轩yx-Kubernertes日志收集 前言 在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志&#xff0c;包括程序直接输出到控制台日志、自定义文件日志等 有哪些日志需要收集 日志收集与分析很重要&#xff0c;为了更加方便的处理异常 简单总结一些比较重要的需要收集…

插件千兆网络变压器72PIN应用图片和设计H87202D

华强盛电子导读&#xff1a;前面199中间2643后面0038 千兆4口网络变压器是一种常用于网络通信领域的电子元件&#xff0c;它可以将高频率的信号进行隔离和滤波&#xff0c;保护网络设备免受电磁干扰&#xff0c;同时也能确保信号的稳定传输。这种网络变压器通常具有多个端口&am…

【云原生kubernetes系列之SkyWalking篇】

1、实战案例 1.1单体jar包监控 1.1.1Halo环境准备 注意&#xff1a;Halo需要jdk11以上的版本 apt install -y java-11-openjdk mkdir /apps/halo -p && cd /apps/halo curl -L https://github.com/halo-dev/halo/releases/download/v1.5.4/halo-1.5.4.jar --outpu…

AI创业者必看!免费分享大模型和算法备案的难点解析

大模型和算法的备案&#xff0c;作为人工智能产品进入市场的第一道门槛&#xff0c;对于每一个创业者来说&#xff0c;都是一个必须认真对待的重要环节。备案不仅要求技术的合规性&#xff0c;还强调了数据安全和隐私保护的重要性。创业者在追求技术创新的同时&#xff0c;也需…

9千含读音文件的中文汉语学习ACCESS\EXCEL数据库

现在英语在我们国内是越来越流行&#xff0c;甚至幼儿园都开始Hello了&#xff0c;但是我们也看到越来越多的老外在学我们的汉语、汉字了。而《含读音文件的中文汉语学习ACCESS数据库》就是一份供老外学习汉字汉语的工具。 数据库收集了上万条汉语常用的字词&#xff0c;并且用…

redhat7.9安装zsh以及常用插件

1 安装zsh并更改默认终端 #1.安装软件包 yum -y install zsh git#2.更改默认终端 chsh -s /bin/zsh然后再退出下终端&#xff0c;重新登录用echo $SHELL 查看环境是否是/bin/zsh 2 配置oh-my-zsh #1.从git仓库中拉取oh-my-zsh git clone https://gitee.com/mirrors/oh-my-z…

xss-labs靶场全关通关

1、level-1 1、输入&#xff0c;发现会将我们输入的内容显示&#xff1a; 2、若未做任何过滤就进行输出&#xff0c;那我们就可以嵌入js代码&#xff0c;执行js脚本&#xff1a; 输入&#xff1a;<script>alert(111)</script> <script></script>&…

LaTeX中的\sloppy命令详解及应用实例

诸神缄默不语-个人CSDN博文目录 在使用 LaTeX 排版文档时&#xff0c;有时候我们会遇到一些段落中的文字或 URL 超出页边距的情况&#xff0c;导致文档版式不够美观。在这种情况下&#xff0c;LaTeX 提供了一些命令来处理这些排版问题&#xff0c;其中一个非常实用的命令就是 …

leetcode172. 阶乘后的零,遍历每个因数中5的个数

leetcode172. 阶乘后的零 给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * … * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#xff1a;3! 6 &#xff0c;不含尾随 0 示例 2&#xff1a; 输…

代码随想录算法day29 | 动态规划算法part02 | 62.不同路径,63. 不同路径 II

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问…

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…

Kubernetes 简介及部署方法

目录 1 Kubernetes 简介及原理 1.1 应用部署方式演变 1.2 容器编排应用 1.3 kubernetes 简介 1.4 K8S的设计架构 1.5 K8S 各组件之间的调用关系 1.6 K8S 的 常用名词感念 1.7 k8S的分层架构 2 K8S 集群环境搭建 2.1 k8s 中容器的管理方式 2.2 k8s中使用的几种管理容器的介绍 3 …

JavaScript 中,File、Blob、Base64 和 ArrayBuffer 不同的用途和转换方法。

JavaScript 中&#xff0c;File、Blob、Base64 和 ArrayBuffer 不同的用途和转换方法。 图示&#xff1a; 文章目录 Blob:File:Base64:Buffer:ArrayBuffer:常用转换函数base64ToFiledataURLtoBlobbinaryToDataURL导出 csv导出文件常用 office 文件对应的 MIME TYPE 和后缀 Bl…

万维网服务器工作

万维网服务器&#xff08;WWW服务器&#xff09;的工作方式主要基于客户机/服务器&#xff08;Client/Server&#xff09;模式&#xff0c;通过HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;等协议与客户端&#xff08;如网页浏览器&…

U盘不小心格式化了怎么恢复?别慌!教你快速恢复

在日常工作和生活中&#xff0c;U盘已成为我们存储和传输数据的重要工具。然而&#xff0c;有时由于误操作或其他原因&#xff0c;我们可能会不小心格式化U盘&#xff0c;导致重要数据的丢失。这时&#xff0c;如何恢复这些数据就显得尤为重要。下面&#xff0c;我们将介绍几种…

黑神话悟空·幽魂怎么打?超爽攻略!

在正式打法之前&#xff0c;这里推荐一款巨好用的开放式耳机&#xff0c;能够让我们的游戏更加的畅快&#xff01; 有条件的也建议使用南卡OE MIX这款开放式耳机&#xff0c;也非常适合在游戏时使用&#xff0c;不入耳的设计避免了长时间游戏佩戴可能带来的耳道不适和耳朵胀痛…

二进制方式安装K8S

⼀、安装说明 本⽂章将演示Rocky 8 ⼆进制⽅式安装⾼可⽤k8s 1.28.0版本。 ⽣产环境中&#xff0c;建议使⽤⼩版本⼤于5的Kubernetes版本&#xff0c;⽐如1.19.5 以后的才可⽤于⽣产环境。 ⼆、集群安装 2.1 基本环境配置 请统⼀替换这些⽹段&#xff0c;Pod⽹段和service和…