CSDN竞赛46期题解

文章讨论了一次编程竞赛的情况,指出对于简单题目Python的代码更简洁,处理大数时更方便,而C++在某些特定问题上显得冗长且易出错。作者建议根据题目特性选择语言,同时批评了竞赛组织者在题型和答案设置上的不严谨,可能导致参赛者兴趣下降。另外,作者还分享了几个竞赛题目的解决方案,包括最大权值计算、图形划分和数组搜索等算法问题。
摘要由CSDN通过智能技术生成

总结

又是很水且重复的一期,除了 T 2 T2 T2对c++选手很不友好外,其它题目都是入门级的,T2的c++选手使用快速幂求个逆元还一直被卡,而python无视大数基本可以秒掉,所以比赛时 T 2 T2 T2果断采用py答题,其它的采用c++作答,当然python对于这类简单题的优势不止于此,面对这种很水的题目python代码作答很轻松,c++作答代码冗长还容易出错。

再次提下邮电出版社赞助的竞赛的题型,之前填空题论文题目答案评测唯一,活动方还以书中答案为准的理由搪塞下,毕竟人家赞助也是为了打广告,不买书不给你奖励也很正常。上次竞赛填空问奠定了基础的数学模型是啥,回答图灵机模型错误,答案是图灵机,大概官方觉得实在不好解释就直接忽略大家的质疑了,连敷衍都懒得敷衍了。虽然说活动方举办竞赛目的是拉赞助,但是不认真出题和设置答案,忽略大家的意见只会让参与的人数越来越少,反过来也会影响别人的赞助的。

最后吐槽下上次比赛收到的图书盲盒,上次题解说到希望图书盲盒别是拿过的几本书了,欣慰的是采纳了这个建议,快递拿到手发现包装上备注写着"阿里云天池大赛赛题解析",然后打开包装发现是"软件研发效能提升指南"。

题目列表

1.吃!吃!吃!

题目描述

已知n个整数。
每3个数算一个周期。
不足一个周期补0.
在周期的第一个位置的数的权值和等于a1+a[1+3]+…

求三个数的最大权值。
如果最大权值为第一个数,输出’J’;
最大权值为第二个数,输出’H’;
最大权值为第三个数,输出’B’。

输入描述:

第一行输入一个整数n。(1<=n<=100)
第二行输入n个整数。

输出描述:

输出答案。

输入样例:

4
1 1 1 1

输出样例:

J

分析

由于题目较为简单,这次题解代码都以python编写,顺便练习下py解题。

首先说下读入,python将input()函数读取的一行字符串使用strip()函数去掉首尾的多余空格,再强转为int类型就得到了单行单个的整数输入了。读取数组时使用map函数,map(function, iterable),类似于c++的for_each,第一个参数传入函数,第二个参数传入可迭代的序列,因此可以使用map(int, input().strip().split())将读取的一行字符串切分为list后逐个调用int函数,返回的对象类型是map,再强转为list就得到了我们需要的list数组了。可见对于单个元素以及数组的读入python相对于c++来说并没有多少优势。

说回本题,本题还是考察阅读理解,数组按照模3的值不同分成三组,输出权值和最大那组的代号即可。

遍历下数组统计出各组的权值和,使用zip将三个权值和映射为三个字母,再使用max求下三个权值和的最大值,在字典中找出最大值映射的字母输出即可。python的简洁之处在于库函数的调用缩短了代码长度,这里使用dic和max结合省去了我们对三个权值和大小的分类讨论操作。

代码

n = int(input().strip())
nums = list(map(int, input().strip().split()))
res = [0, 0, 0]
for i in range(len(nums)):
    res[i % 3] += nums[i]
s = ['J', 'H', 'B']
m = dict(zip(res, s))
t = max(res)
print(m[t])

2.:n边形划分

题目描述

已知存在n多边形,n为奇数。
连接多边形所有对角线。
能形成多少区域。

输入描述:

给定整数n。(1<=n<=1e9)

输出描述:

输出区域数,对1e9+7取模

输入样例:

5

输出样例:

11

分析

没意思的题目,结果的公式是 ( n − 1 ) ∗ ( n − 2 ) ∗ ( n 2 − 3 n + 12 ) 24 \frac{(n-1)*(n-2)*(n^2-3n+12)}{24} 24(n1)(n2)(n23n+12)。python作答无需考虑数值溢出,每乘个操作就取下模以及除法用乘法逆元替代了。

代码

n = int(input().strip())
res = (n - 1) * (n - 2) * ( n ** 2 - 3 * n + 12) // 24;
print(res % 1000000007)

3.求最小元素

题目描述

假设一个按升序排序的数组在未知的某个中心点旋转。(即[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。找到数组中最小 元素。您可以假设阵列中不存在重复项。

输入描述:

第一行输入整数n。(1<=n<=10000)表示数组的大小
第二行给出n个整数a.(0<=a<=1e9)

输出描述:

输出答案

输入样例:

5
3 4 5 1 2

输出样例:

1

分析

本来是一道考察二分的面试题,奈何数据规模很小,不出个1e9的数据规模都不需要使用二分,一个min函数的调用就完了,python初学者看了都觉得简单。

代码

n = int(input().strip())
nums = list(map(int, input().strip().split()))
print(min(nums))

4.连续子数组的最大和

题目描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和 。(测试用例仅做参考,我们会根据代码质量进行评分)

输入描述:

第一行输入整数数组的大小n。(1<=n<=1000)
第二行给出n个整数a。(-1e5<=a<=1e5)

输出描述:

输出答案。

输入样例:

9
-2 1 -3 4 -1 2 1 -5 4

输出样例:

6

分析

又是不知道出了多少次的老题目,遍历时候累计的连续序列和如果小于0,就不需要参加后面序列和的累加了,只有累计和大于0时,才需要累加上去,最后对所有的连续子序列的最大和求个max就是答案了。

代码

n = int(input().strip())
nums = list(map(int, input().strip().split()))
res = t = -1e9
for x in nums:
	if t < 0:
    	t = x
    else:
        t += x
    res = max(res, t)
print(res)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值