NYOJ 240 小明的调查统计(二)

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=240

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string>
 5 using namespace std;
 6 struct chenji
 7 {
 8     int bj;//班级编号
 9     int xh;//学号
10     int cj;//数学成绩
11     int mc;//名次
12 } c[100001];
13 bool comp(chenji x,chenji y)//此处是排序函数。
14 { 
15     if(x.cj<y.cj) return true;//判断成绩是否相同。
16     if(x.cj==y.cj&&x.bj<y.bj)return true;//倘若成绩相同,比较班级。
17     if(x.cj==y.cj&&x.bj==y.bj&&x.xh<y.xh)return true;//若成绩相同,班级相同,比较学号。
18     else return false;
19 }
20 int main()
21 {
22     int i,j,k,l,n,m,count=0,s,a;
23     scanf("%d%d",&n,&m);
24     for(i=1;i<=n;i++)//把数据储存到结构体里面
25     {   scanf("%d",&s);
26         for(j=1;j<=s;j++)
27         {
28             c[count].bj=i;//此处count只能这样写,不可以写成count++,不然会把数据储存到下个结构体里面。
29             c[count].xh=j;
30             scanf("%d",&k);
31             c[count].cj=k;
32             count++;//这时自加,可以使数据储存到下个编号的结构体中去。
33         }
34     }
35     sort(c,c+count,comp);
36     l=1;//此处的l进行标记排名
37     c[count-1].mc=1;//把最后一个的排名赋值为1,避免访问到非法空间
38     for(i=count-2;i>=0;i--)
39      {if(c[i].cj==c[i+1].cj)//进行判断,是否与后面的成绩相同
40             c[i].mc=l;
41      else
42          c[i].mc=++l;
43     }
44     for(i=1;i<=m;i++)
45     {
46         scanf("%d",&a);
47         for(j=0;j<count;j++)//因为题目要求是按照班级、学号从小到大输出,故从0开始
48         {
49             if(c[j].mc==a)
50                 printf("%d %d\n",c[j].bj,c[j].xh);
51         }
52 
53     }return 0;
54 }

这个题跟杭电的那道海选女主角很相似。但是不同的是这道题需要多加一层判断。对成绩进行排名,需要考虑到并列名次。

 

这道题刚开始的思路是给成绩降序排序,后来发现在输出结果的时候,不知道怎么输出了,费了好大一会,没思路,不知道怎么多层比较;。。。。

 

解题思路:

 

定义结构体,用结构体储存班级,学号,成绩,名次。然后用sort排序。不过需要在最开始的地方写一个排序函数,实现先对成绩排序,成绩相同在对班级排序,班级相同再对学号排序。

 

因为要输出第m名同学的班级和学号,所以我们要在最后加层判断。

 

 

posted on 2012-08-07 21:13  mycapple  阅读(404)  评论(0编辑  收藏  举报

导航