快速排序的题

Problem Description

今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑 
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的 
考生,并将他们的成绩按降序打印。 
 

Input

测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N 
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一 
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号 
(题目号由1到M)。 
当读入的考生人数为0时,输入结束,该场考试不予处理。 
 

Output

对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高 
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考 
号的升序输出。 
 
 
 
 1 #include<stdio.h>  
2 #include<string.h>
3 struct acm
4 {
5 char nam[100];
6 int s;
7 }r[1000];
8 int qsort(struct acm r[],int l,int h)
9 {
10 struct acm key;
11 key = r[l];
12
13 while(l < h)
14 {
15 while(l < h&&r[h].s <= key.s)
16 {
17 if(r[h].s == key.s&&(strcmp(r[h].nam,key.nam)<0))
18 break;
19 h--;
20 }
21 r[l] = r[h];
22
23 while(l < h && r[l].s >= key.s)
24 {
25 if(r[l].s == key.s&&(strcmp(r[l].nam,key.nam)>0))
26 break;
27
28 l++;
29 }
30 r[h] = r[l];
31 }
32
33 r[l] = key;
34 return l;
35
36 }
37 void sort(struct acm r[],int l,int h)
38 {
39 int k;
40 if(l < h)
41 {
42 k = qsort(r,l,h);
43 sort(r,l,k-1);
44 sort(r,k+1,h);
45 }
46 }
47 int main()
48 {
49 struct acm r[1000];
50 int n,d,k,j,i,m,score,pro[11];
51 while(scanf("%d",&n)&&n)
52 {
53 scanf("%d%d",&m,&score);
54 for(i=1;i <= m;i++)
55 {
56 scanf("%d",&pro[i]);
57 }
58 for(i = 0;i<n;i++)
59 {
60 scanf("%s",r[i].nam);
61 scanf("%d",&k);
62 r[i].s = 0;
63 for(j=0;j<k;j++)
64 {
65 scanf("%d",&d);
66 r[i].s+=pro[d];
67 }
68 }
69 sort(r,0,n-1);
70 k = 0;
71 for(i=0;i<n;i++)
72 {
73 if(r[i].s>=score)
74 k++;
75 }
76 printf("%d\n",k);
77 for(i=0;i < k;i++)
78 {
79 printf("%s %d\n",r[i].nam,r[i].s);
80 }
81
82 }
83 return 0;
84 }
posted @ 2012-02-22 23:48  某某。  阅读(291)  评论(0编辑  收藏  举报