小明的调查统计(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:1
-
描述
- 最近小明他们社团对理工全校每个班级进行了一次社会调查,他们对每同学的数学成绩进行了统计。小明的任务是老师想知道全校成绩排在第n名同学的班级号和班级学号(如果成绩相同就并列排在同一名次),现在你需要编一个程序帮助小明来完成这个任务。
-
输入
- 只有一组测试数据
第一行输入正整数T(0<T<=500)和M(0<M<=101),表示学校的班级数和老师需要查询的次数
随后有T行数据,第i行表示班级号为i的班级,每行第一个数N(0<N<=200)表示这个班级有N个同学。接下来输入N个正整数,第j个正整数表示班级学号为j同学的数学成绩(0=<数学成绩<=100,班级号和班级学号都是从1开始)。
随后的M行数据,每行数据有一个正整数Q,表示查询全校数学成绩排名第Q位的所有同学的班级号和班级学号。
输出 - 每次查询输出占一行,输出成绩排在第Q位同学的班级号和学号(如果有多同学成绩并列排在在第Q名,那么按班级号从小到大输出,如果班级号相同那么按班级学号从小到大输出) 样例输入
-
3 4 10 23 56 89 41 23 54 65 23 89 68 3 89 78 85 5 56 68 76 56 74 1 2 3 4
样例输出 -
1 3 1 9 2 1 2 3 2 2 3 3
今天终于把这个题AC了,以前看了好几次都没想到解决方法。我认为这题其实就是对结构体的运用,一开始我定义了一个一维结构体数组,但后来发现不能完整的储存学生信息(因为我少定义了一个变量),于是我就定义了一个二维的结构体数组,a[i][j]表示第i个班级第j个学生,但是对它操作的时候又遇到了新的问题。后来仔细想一想,一维的可以解决,只不过要开一个很大的数组,但是应该可以解决问题。于是就一边写一边调试,最后,测试样例过了,提交,Accepted!
分享一下我的代码:
#include<stdio.h> #include<algorithm> using namespace std; struct stud { int clanum; /*班级号*/ int num; /*学号*/ int sco; /*成绩*/ int rank; /*排名*/ }a[100002]; /*最多有500个班级*每个班级最多200名学生*/ bool comp(stud a1,stud a2) /*按要求排序*/ { if(a1.sco!=a2.sco) return a1.sco>a2.sco; if(a1.clanum!=a2.clanum) return a1.clanum<a2.clanum; if(a1.num!=a2.num) return a1.num<a2.num; } int main() { int t,m,n,i,j,temp,w,k=0,e,h,count; scanf("%d%d",&t,&m); /*t个班级,m次询问*/ for(i=1;i<=t;i++) { scanf("%d",&n); /*班级学生数*/ for(j=1;j<=n;j++) { scanf("%d",&w); /*学生成绩*/ a[k].sco=w; /*第i个班级第j个学生的成绩*/ a[k].clanum=i; /*第i个班级*/ a[k].num=j; /*第j个学生*/ k++; } } sort(a,a+k,comp); /*排序*/ count=1; /*排名开始为1,即第一名*/ h=a[0].sco; /*比较时的变量*/ for(i=0;i<k;i++) /*把所有学生从头到尾遍历一次*/ { if(a[i].sco!=h) /*不并列*/ { h=a[i].sco; /*把这个学生的成绩设为比较时的变量*/ count++; /*名次加1*/ } a[i].rank=count; /*count记录名次*/ } for(j=0;j<m;j++) /*m次查询*/ { scanf("%d",&temp); /*要查询的排名*/ for(i=0;i<k;i++) { int flag=0; /*0为还没有输出排名为temp的学生信息*/ while(temp==a[i].rank) /*找到了排名为temp的学生,把这些学生信息一次输完*/ { printf("%d %d\n",a[i].clanum,a[i].num); i++; flag=1; /*标记已经输出学生信息*/ } if(flag) /*已经输出学生信息*/ break; } } return 0; }
- 只有一组测试数据