nbhkdz.com冰点文库

NOIP竞赛培训第六讲

时间:2016-10-06


New:高级的排序算法
?

快速排序

New:QuickSort, O(nlog2n), 不稳定
?

?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

void quicksort (int data[], int low, int high)

{ int i,pivot,j; if(low<high) { pivot=data[low]; i=low; j=high; while(i<j) { while(i<j && data[j]>=pivot) j--; if(i<j) data[i++]=data[j]; while(i<j && data[i]<=pivot) i++; if(i<j) data[j--]=data[i]; } data[i]=pivot; quicksort(data,low,i-1); quicksort(data,i+1,high); } }

Exercise:儿童节闯关游戏
?

XX同学找到了一个儿童节闯关游戏,共要完成N关,每关的编号是个1到1000关 之间的随机关卡(N≤100),对于其中重复的,只需通过一次即可,把其余相 同的关卡数去掉,不同的数对应着不同的关卡号。然后再把这些数从小到大排 序,按照排好的顺序依次进行闯关。XX同学想用计算机程序协助他完成“去重” 与“排序”的工作。 输入格式: 输入有2行,第1行为1个正整数,表示所生成的要闯关的关卡个数:N 第2行有N个用空格隔开的正整数,为所产生的关卡号码。 输出格式 输出也是2行,第1行为1个正整数M,表示不相同的关卡的个数。第2行为M个用 空格隔开的正整数,为从小到大排好序的不相同的关卡。

?

?
? ?

? ?
? ? ?

?

样例输入 10 20 40 32 67 40 20 89 300 400 15 样例输出 8 15 20 32 40 67 89 300 400

Exercise:奖学金 No.1398
?

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5 名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。 先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到 低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后 按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个 人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某 个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这 两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之 和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据 是: 5 279 7 279 则按输出错误处理,不能得分。

End