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 }