题面:输入一列整数,输出它们的总和、最大值、最小值、并从大到小输出。
先上一波伪代码,认真地做一波数组排序题。
#include<stdio.h> #include<math.h> ] , b[]; int main () { , min = pow( , ) - , max = -pow(,); scanf("%d",&a); ; i <= a ; i ++) { scanf("%d",&c[i]); sum += c[i]; if(c[i] > max) max = c[i] ; if(c[i] < min) min = c[i] ; //先统计不重复的个数,记为An 。 //桶排序,或者冒泡排序进行排序,注意重复的值,放到这个数组b中。 ; } printf("%d\n%d\n",max,min); ; k <= /*An*/; k ++ ) printf("%d\n",b[k]); ; }
伪代码
不知道有没有把这个题做复杂,总之在啥都不会的情况下,第一个想到的是桶排序,然而只会冒泡排序的部分。
//一会专门开一个随笔写写自己对于那些排序的理解与想法。
很皮,在研究一番桶排序之后,发现桶排序,就是将值放到另一个数组对应的值的数组位数上面去,b[c[i]] = 1,如果需要多次输入,改成b[c[i]] ++即可。
于是很兴奋地试了样例,过了,交上去,果断WA了,尬的一批。
#include<stdio.h> #include<math.h> ] , b[]; int main () { , min = pow( , ) - , max = -pow(,); scanf("%d",&a); ; i <= a ; i ++) { scanf("%d",&c[i]); sum += c[i]; if(c[i] > max) max = c[i] ; if(c[i] < min) min = c[i] ; b[c[i]] = ; } printf("%d\n%d\n%d\n%d\n",sum,max,min,max); ; j -- ) ; k < b[j]; k ++ ) printf("%d\n",j); ; }
第一次交
于是观察到了一个奇葩的值
10 9 9 9 9 9 9 9 9 9 9
在我的第一个桶排序中,很迷地输出不了最大值,于是在for循环前加了一个最大值,导致这组值输出的多了一个9。问题不大,在外层循环的地方扩到了最大,很愉快地过了。
#include<stdio.h> #include<math.h> ] , b[]; int main () { , min = pow( , ) - , max = -pow(,); scanf("%d",&a); ; i <= a ; i ++) { scanf("%d",&c[i]); sum += c[i]; if(c[i] > max) max = c[i] ; if(c[i] < min) min = c[i] ; b[c[i]] = ; } printf("%d\n%d\n%d\n",sum,max,min); ; j >= ; j -- ) ; k < b[j]; k ++ ) printf("%d\n",j); ; }
但是最后还是WA了一个点,因为500太小了,测试点有一个是5058,就没有输出。
最终完成代码
#include<stdio.h> #include<math.h> ] , b[]; int main () { , min = pow( , ) - , max = -pow(,); scanf("%d",&a); ; i <= a ; i ++) { scanf("%d",&c[i]); sum += c[i]; if(c[i] > max) max = c[i] ; if(c[i] < min) min = c[i] ; b[c[i]] = ; } printf("%d\n%d\n%d\n",sum,max,min); ; j >= ; j -- ) ; k < b[j]; k ++ ) printf("%d\n",j); ; }
AC代码
ps:我觉得我的代码不丑吧,虽然在算法方面很颓,但是还是算得上工整好看的吧。
复习了桶排序,近40分钟才A了这么一道题,尬。
那是我愿意付诸一生的人,现在却没法拥有。