【竞赛经历】CSDN第46期竞赛题解

文章目录

  • 1 前言
  • 2 题解
    • 2.1 第一题:吃吃吃
    • 2.2 第二题:n边形划分
    • 2.3 第三题:求最小元素
    • 2.4 第四题:连续子数组最大和

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=(n1)(n2)(n23n+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;
}

你可能感兴趣的:(学习笔记,算法,动态规划,dp,竞赛,acm)