第一题:吃吃吃
题目描述
已知n个整数。
每3个数算一个周期。
不足一个周期补0.
在周期的第一个位置的数的权值和等于a1+a[1+3]+…
…
求三个数的最大权值。
如果最大权值为第一个数,输出’J’;
最大权值为第二个数,输出’H’;
最大权值为第三个数,输出’B’。
输入描述:
第一行输入一个整数n。(1<=n<=100)
第二行输入n个整数。
输出描述:
输出答案。
输入样例:
4
1 1 1 1
输出样例:
J
题解:
这道题算是比较简单的,基本上学过一两个月的编程语言都能做出来,所以代码我只写函数部分。
sum[3]={0,0,0};//记录三组和
for(int i=0;i<n;i+=3){
sum[0]+=vec[i];
}
for(int j=1;j<n;k+=3){
sum[1]+=vec[j];
}
for(int k=2;k<n;k+=3){
sum[2]+=vec[k];
}
三个循环结束的时候可能不太一样,我写了三个。
接下来只需要寻找一下最大值就可以了。
2:n边形划分
题目描述
已知存在n多边形,n为奇数。
连接多边形所有对角线。
能形成多少区域。
输入描述:
给定整数n。(1<=n<=1e9)
输出描述:
输出区域数,对1e9+7取模
输入样例:
5
输出样例:
11
题解:
这是一道公式题,只需要将公式(n−1)∗(n−2)∗(n^2−3n+12)/24带入即可,这道题对C的选手很不友好,一开始我也是选择C和C++写的,但是编译报错,只能使用python来过了。由于代码没有什么难度,我这里也不展示了。
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
题解:
这题是入门级别的,完全可以将其“按升序排序的数组在未知的某个中心点旋转”忽略掉,说白了就是一道让你寻找最小值的题,是四道题里最简单的了,所以具体的代码我也不过多叙述了。
4.连续子数组最大和
题目描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和 。(测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:
第一行输入整数数组的大小n。(1<=n<=1000)
第二行给出n个整数a。(-1e5<=a<=1e5)
输出描述:
输出答案。
输入样例:
9
-2 1 -3 4 -1 2 1 -5 4
输出样例:
6
题解:
这一题在算法中算是一道比较经典的题目,,在学习分治法和动态规划是都会有所涉及,而本题也有三种解题思路,一种是暴力枚举(时间复杂度O(n^3)),一种是分治法(时间复杂度O(nlogn))还有一种就是动态规划(O(n))。可以看出动态规划是非常快的,具体我也不想过多介绍,因为网上实在太多了,直接上C的代码。
void solution(int n,int* arr ){
int max=0,MAX=0;
for(int i=0;i<n;i++){
MAX+=arr[i];
if(MAX<arr[i]){
MAX=arr[i];
}
if(MAX>max){
max=MAX;
}
printf("%d",max);
}