小明的调查统计(二)

小明的调查统计(二)

时间限制: 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
来源
[路过这]原创
上传者

路过这



思路很清晰


#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;
 } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值