1 前言
这次的题目比较简单,但是由于考试报告下载的是空白的,这里题目部分参考的是这篇博客。下面简单说说题解。
2 题解
2.1 第一题:吃吃吃
- 题目
已知n个整数。 每3个数算一个周期。 不足一个周期补0. 在周期的第一个位置的数的权值和等于a[1]+a[1+3]+… …
求三个数的最大权值。 如果最大权值为第一个数,输出’J’; 最大权值为第二个数,输出’H’; 最大权值为第三个数,输出’B’。输入描述:第一行输入一个整数n。(1<=n<=100), 第二行输入n个整数。
输出描述:输出答案。
输入样例:
4
1 1 1 1输出样例:
J
- 题解
这道题非常简单,可以直接用range
函数设定3的步长,因为是求和,所以补零也无所谓。
n = 4
v = [.......]
sum1 = sum([v[i] for i in range(0,n,3)])
sum2 = sum([v[i] for i in range(1,n,3)])
sum3 = sum([v[i] for i in range(2,n,3)])
2.2 第二题:n边形划分
- 题目
已知存在n多边形,n为奇数。
连接多边形所有对角线。
能形成多少区域。输入描述:
给定整数n。(1<=n<=1e9)
输出描述:
输出区域数,对1e9+7取模
输入样例:
5
输出样例:
11
- 题解
这种问题一看就知道是数学当中的典型问题,所以不了解的问问搜索引擎。根据这篇博客的描述,这个问题有一个固定的公式:
T n = ( n − 1 ) ( n − 2 ) ( n 2 − 3 n + 12 ) / 24 T_n=(n-1)(n-2)(n^2-3n+12)/24 Tn=(n−1)(n−2)(n2−3n+12)/24
因此直接用代码实现公式即可,非常简单,不过这里需要注意的是,由于结果肯定是一个整数,那么在python当中除法/
建议使用整除//
,这样能保证输出结果为整数,然后这里的1e9+7
也不要直接这样写,而是给它写成整数的形式,那为什么不直接算完然后外面套个int呢?我也不知道,反正就是当时没有通过。。。。
完整的代码建议参考这篇博客。
2.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
- 题解
一开始以为这个时间会限制得很死,如果用求最小值的方法去算,相当于要遍历整个数组,但是只找下降点可能只需要遍历半个数组,时间大概是一半。但是!!!没想到的是尝试了一下min
函数,竟然就过了???
2.4 第四题:连续子数组最大和
- 题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和(测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:
第一行输入整数数组的大小n。(1<=n<=1000) 第二行给出n个整数a。(-1e5<=a<=1e5)
输出描述:输出答案。
输入样例:
9
-2 1 -3 4 -1 2 1 -5 4输出样例:
6
- 题解
这道题可能是最难的一道了,但是由于是经典问题,所以解法很多,常用的是动态规划法,代码非常简洁。
int MaxSum(int n, int *a)
{
int sum=0, b=0;
for(int i=0; i<=n; i++)
{
if(b>0)
b += a[i];
else
b = a[i];
if(b>sum)
sum = b;
}
return sum;
}