http://acm.nyist.net/JudgeOnline/problem.php?pid=240
小明的调查统计(二)
时间限制: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代码:
分析:
结构体排序即可。 - 直接排序:
-
1 2 #include<stdio.h> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int T,M,N; 8 int i,j,k,max=0; 9 int b[200]={0},a[500][200]={0}; 10 int num=0; 11 scanf("%d %d",&T,&M); 12 for(i=0;i<T;i++) 13 { 14 scanf("%d",&N); 15 if(max<N) max=N; 16 for(j=0;j<N;j++) 17 { 18 scanf("%d",&a[i][j]); 19 int t=0; 20 for(k=0;k<num;k++) 21 if(a[i][j]==b[k]) t=1; 22 if(t==0) 23 {b[num]=a[i][j];num++;} 24 } 25 } 26 sort(b,b+num); 27 while(M--) 28 { 29 int n; 30 scanf("%d",&n); 31 for(i=0;i<T;i++) 32 for(j=0;j<max;j++) 33 if(a[i][j]==b[num-n]) 34 printf("%d %d ",i+1,j+1); 35 } 36 return 0; 37 }
结构体排序:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 struct data//data保存输入数据用 6 { 7 int number;//人数 8 int *p;//学生成绩 9 }; 10 11 struct one 12 { 13 int c;//班级 14 int zb;//学号 15 int z;//成绩 16 int w;//名次 17 }; 18 19 //自定义sort排序,先按分数从大到小,再按班级从小到大,再按学号从小到大 20 bool cmp(one a,one b) 21 { 22 if(a.z!=b.z)return a.z>b.z; 23 if(a.c!=b.c)return a.c<b.c; 24 return a.zb<b.zb; 25 } 26 int main() 27 { 28 data *s; 29 one x[100010]; 30 int t,m,i,j,k=0; 31 cin>>t>>m; 32 s=new data[t]; 33 for(i=0; i<t; i++) //输入数据 34 { 35 cin>>s[i].number; 36 s[i].p=new int[s[i].number]; 37 for(j=0; j<s[i].number; j++) 38 { 39 cin>>s[i].p[j]; 40 x[k].zb=j+1; 41 x[k].z=s[i].p[j]; 42 x[k].c=i+1; 43 k++; 44 } 45 } 46 sort(x,x+k,cmp); 47 int count=1,h=x[0].z,temp; 48 for(i=0; i<k; i++) //循环,排序分数名次 49 { 50 if(x[i].z!=h) 51 { 52 h=x[i].z; 53 count++; 54 } 55 x[i].w=count; 56 } 57 while(m--) 58 { 59 cin>>temp; 60 for(i=0; i<k; i++) 61 { 62 if(temp==x[i].w) cout<<x[i].c<<" "<<x[i].zb<<endl; 63 if(x[i].w>temp) break; 64 } 65 } 66 return 0; 67 }