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