小明的调查统计(二)
-
描述
-
最近小明他们社团对理工全校每个班级进行了一次社会调查,他们对每同学的数学成绩进行了统计。小明的任务是老师想知道全校成绩排在第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
来源
- [路过这]原创 上传者
思路很清晰
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct paiming{
int num1;//班级号
int num2;//班级学号
int num3;//数学成绩
int num4;//排名
}a[100002];
bool cmp(paiming x,paiming y)
{
if(x.num3!=y.num3)
return x.num3>y.num3;//成绩降序排列
if(x.num1!=y.num1)
return x.num1<y.num1;//班级号升序
if(x.num2!=y.num2)
return x.num2<y.num2;//班级学号升序
}
int main()
{
int t,m,n,q;
scanf("%d%d",&t,&m);//班级号和查询次数
int i,j,k=0,flag=1,b,c,d;//flag记录名次
for(i=1;i<=t;++i)
{
scanf("%d",&n);//n个成绩
for(j=1;j<=n;++j)
{
scanf("%d",&b);
a[k].num1=i;//班级号
a[k].num2=j;//班级学号
a[k].num3=b;//成绩
k++;
}
}
sort(a,a+k,cmp);
c=a[0].num3;
for(i=0;i<k;i++)
{
//处理排名
if(c!=a[i].num3)
{
flag++;
c=a[i].num3;
}
//相等的并列
a[i].num4=flag;
}
for(i=0;i<m;++i)
{
//开始查询了
scanf("%d",&q);
for(j=0;j<k;++j)
{
while(q==a[j].num4)
{
//因为会有排序并列的情况,所以用while不用if
printf("%d %d\n",a[j].num1,a[j].num2);
j++;
}
}
}
return 0;
}
-
只有一组测试数据