1 /*小明的调查统计(二) 2 时间限制:1000 ms | 内存限制:65535 KB 3 难度:1 4 描述 5 最近小明他们社团对理工全校每个班级进行了一次社会调查,他们对每同学的数学成绩进行了统计。小明的任务是老师想知道全校成绩排在第n名同学的班级 6 号和班级学号(如果成绩相同就并列排在同一名次),现在你需要编一个程序帮助小明来完成这个任务。 7 输入 8 只有一组测试数据 9 第一行输入正整数T(0<T<=500)和M(0<M<=101),表示学校的班级数和老师需要查询的次数 10 随后有T行数据,第i行表示班级号为i的班级,每行第一个数N(0<N<=200)表示这个班级有N个同学。接下来输入N个正整数,第j个正整数表示班级学号为j同学 11 的数学成绩(0=<数学成绩<=100,班级号和班级学号都是从1开始)。 12 随后的M行数据,每行数据有一个正整数Q,表示查询全校数学成绩排名第Q位的所有同学的班级号和班级学号。 13 输出 14 每次查询输出占一行,输出成绩排在第Q位同学的班级号和学号(如果有多同学成绩并列排在在第Q名,那么按班级号从小到大输出,如果班级号相同那么按班级 15 学号从小到大输出) 16 样例输入 17 3 4 18 10 23 56 89 41 23 54 65 23 89 68 19 3 89 78 85 20 5 56 68 76 56 74 21 1 22 2 23 3 24 4 25 样例输出 26 1 3 27 1 9 28 2 1 29 2 3 30 2 2 31 3 3 32 来源 33 [路过这]原创 34 上传者 35 路过这 36 */ 37 38 #include<stdio.h> 39 40 41 42 /*错误代码 43 struct Student 44 { 45 int clas; 46 int num; 47 int grade; 48 int name; 49 } stu[100010] ; 50 int main() 51 { 52 int T, M, i, j, k, N, n=0, p; 53 scanf("%d%d",&T, &M); 54 struct Student temp; 55 for(i=0; i<T; i++) 56 { 57 scanf("%d",&N); 58 for(j=0; j<N; j++) 59 { 60 stu[n++].clas = i+1; 61 stu[n++].num = j+1; 62 scanf("%d",&stu[n++].grade ); 63 } 64 }//输入成绩 65 for(i=0; i<n; i++) 66 for(j=i+1; j<n; j++) 67 { 68 if(stu[i].grade < stu[j].grade) 69 { 70 temp = stu[i]; 71 stu[i] = stu[j]; 72 stu[j] = temp; 73 } 74 }//按成绩排序 75 k=1; 76 stu[0].name = k; 77 for(i=0; i<n; i++) 78 { 79 if(stu[i].grade > stu[i+1].grade) 80 stu[i+1].name = k++; 81 else 82 stu[i+1].name = k; 83 }//给定名次 84 for(i=1; i<=M; i++) 85 { 86 scanf("%d",&p); 87 for(j=0; j<n; j++) 88 { 89 if(stu[j].name == p) 90 printf("%d %d\n", stu[j].clas, stu[j].num); 91 } 92 } 93 return 0; 94 } 95 96 */ 97 98 99 AC代码 100 int main() 101 { 102 int s[501][201]={0}, i, k, j, buf[101]={0}, T, M, N, n, max=0; 103 scanf("%d %d",&T , &M); 104 for(i = 0; i < T; i++ ) 105 { 106 scanf("%d",&N); 107 max = N>max ? N : max; 108 for(j = 0; j < N; j++) 109 { 110 scanf("%d", &s[i][j] ); 111 k = s[i][j]; 112 buf[k] = 1; 113 } 114 }//输入并记录成绩 115 for(i = 0; i < M; i++) 116 { 117 scanf("%d",&n); 118 k=0; 119 for(j = 100; j >= 0; j--) 120 { 121 if( buf[j] ) k++; 122 if(k == n)//成绩匹配名次 123 { 124 n=j; 125 for(k = 0; k < T; k++) 126 for(j = 0; j < max; j++) 127 if(s[k][j] == n) 128 printf("%d %d\n",k+1 , j+1); 129 break; 130 } 131 } 132 } 133 return 0; 134 }