NOIP200701奖学金

 

试题描述

    某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

    任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7279

5279

    这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:

5279

7279

    则按输出错误处理,不能得分。

 

输入
包含n+1行: 
第1行为一个正整数n,表示该校参加评选的学生人数。 
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间z第1行的3个数 字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为l~n (恰好是输入数据的行号减1)。 

所给的数据都是正确的,不必检验。 
输出
共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。 
输入示例
【输入样例1】 
6      
90 67 80  
87 66 91    
78 89 91     
88 99 77     
67 89 64       
78 89 98       
【输入样例2】
8     
80 89 89     
88 98 78    
90 67 80    
87 66 91     
78 89 91     
88 99 77     
67 89 64     
78 89 98  


输出示例
【输出样例1】 
6 265
4 264
3 258
2 244
1 237
【输入样例1】 
8 265
2 264
6 264
1 258
5 258
其他说明
【限制】50%的数据满足:各学生的总成绩各不相同 100%的数据满足: 6<=n<=300 
 

炒鸡简单的一道题。下面贡献两份代码

第一份:普通版

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main(int argc, char *argv[])
 6 {   
 7     int n,c[305]={0},m[305]={0},e[305]={0},i,j,s[305]={0},x[305]={0};
 8     cin>>n;
 9     for(i=1;i<=n;i++)
10     {
11         cin>>c[i];
12         cin>>m[i];
13         cin>>e[i];
14         s[i]=c[i]+m[i]+e[i];
15         x[i]=i;
16         //cout<<c[i]<<" "<<m[i]<<" "<<e[i]<<" "<<s[i]<<endl;
17     }
18   for(i=1;i<n;i++)
19     {
20         for(j=i+1;j<=n;j++)
21         {
22             if(s[i]<s[j])
23             {
24                 swap(s[i],s[j]);
25                 swap(c[i],c[j]);
26                 swap(x[i],x[j]);
27             }
28            else if(s[i]==s[j])
29             {
30                 if(c[i]<c[j])
31                 {
32                     swap(s[i],s[j]);
33                     swap(c[i],c[j]);
34                     swap(x[i],x[j]);
35                   
36                 }
37                 else if(c[i]==c[j])
38                 {
39                     if(x[i]>=x[j])
40                     {
41                         swap(s[i],s[j]);
42                         swap(c[i],c[j]);
43                         swap(x[i],x[j]);
44                     }
45                 }
46             }
47         }
48         //cout<<x[i]<<" "<<s[i]<<endl;
49     }
50     for(i=1;i<=5;i++)
51     {
52         cout<<x[i]<<" "<<s[i]<<endl;
53     }
54     return 0;
55 }
NOIP200701奖学金

第二份:运算符重载版。最近新学会的运算符重载,还挺方便的。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 struct data  //运算符重载 
 5 {
 6     int num,ch,z,ma,eng;
 7     bool operator<(const data &a)const
 8     {
 9         if(z>a.z) return true;   //用原来的总分和当前比,如果大,不用交换 
10         else if(z==a.z && ch>a.ch) return true;  //如果总分一样,比语文 
11         else if(z==a.z && ch==a.ch && num<a.num) return true; //如果总分和语文都一样,比学号 
12         else return false;
13     }
14 }a[400];
15 int main()
16 {
17     int n,i,j;
18     scanf("%d",&n);
19     for(i=1;i<=n;i++)
20     {
21         a[i].num=i;
22         scanf("%d%d%d",&a[i].ch,&a[i].ma,&a[i].eng);
23         a[i].z=a[i].ch+a[i].ma+a[i].eng;
24     }
25     sort(a+1,a+n+1);
26     for(i=1;i<=5;i++)
27     {
28         printf("%d %d\n",a[i].num,a[i].z);  //'\n'是回车 
29     }
30     return 0;
31 }
NOIP200701奖学金(2)

 

posted @ 2016-01-22 09:03  姚呵呵  阅读(390)  评论(0编辑  收藏  举报