给大家介绍一个OJ,代码源,准备CSP-J/S,ICPC/CCPC都可以到这里面找,题目质量很可以,界面也很不错
题目
传送门
给定nnn个整数a1,a2,…,ana_1,a_2,\dots,a_na1 ,a2 ,…,an ,求其中最大,次大,和第三大的值的和
对于100%100\%100%的数据,3≤n≤1003\le n \le 1003≤n≤100,1≤ai≤1051 \le a_i \le 10^51≤ai ≤105
解析
100%
对nnn个数进行排序,选择最大的三个数求和即可
时间复杂度O(nO(nO(n logloglog n)n)n),空间复杂度O(n)O(n)O(n)
考虑能否O(n)O(n)O(n)求最大,次大,和第三大的值,答案当然是可以的,思路如下:
定义三个变量firstmaxfirstmaxfirstmax,secondmaxsecondmaxsecondmax,thirdmaxthirdmaxthirdmax
每次遇到一个数(xxx)分为444种情况:
1. xxx大于firstmaxfirstmaxfirstmax,这种情况下最大值变为这个数,次大值变为之前的最大值,第三大值变为之前的第二大值,这里为了记录之前的值,要开个变量存储一下
2. xxx不符合1.但xxx大于secondmaxsecondmaxsecondmax,这种情况下最大值不变,次大值变为这个数,第三大值变为之前的第二大值,这里为了记录之前的值,同1.
3. xxx不符合1.2.但xxx大于thirdmaxthirdmaxthirdmax,这种情况下,最大值不变,次大值不变,第三大值变为这个数
4. xxx不符合1.2.3.不做处理
时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)
由于iii对aia_iai 没有影响,所以可以滚动变量存储
时间复杂度O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)