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名同学的班级和学号,所以我们要在最后加层判断。

 

 

你可能感兴趣的:(统计)