NYOJ 240 小明的调查统计(二)

本文深入探讨了算法设计与数据结构应用的核心概念,包括排序算法、动态规划、哈希算法、贪心算法等,并结合实例展示了这些原理在实际问题解决中的应用,旨在提升读者在计算机科学领域的理论理解与实践能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小明的调查统计(二)

时间限制: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了,以前看了好几次都没想到解决方法。我认为这题其实就是对结构体的运用,一开始我定义了一个一维结构体数组,但后来发现不能完整的储存学生信息(因为我少定义了一个变量),于是我就定义了一个二维的结构体数组,a[i][j]表示第i个班级第j个学生,但是对它操作的时候又遇到了新的问题。后来仔细想一想,一维的可以解决,只不过要开一个很大的数组,但是应该可以解决问题。于是就一边写一边调试,最后,测试样例过了,提交,Accepted! 分享一下我的代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct stud
{
    int clanum; /*班级号*/
	int num; /*学号*/
	int sco; /*成绩*/
	int rank; /*排名*/
}a[100002]; /*最多有500个班级*每个班级最多200名学生*/
bool comp(stud a1,stud a2) /*按要求排序*/
{
    if(a1.sco!=a2.sco) return a1.sco>a2.sco;
    if(a1.clanum!=a2.clanum)  return a1.clanum<a2.clanum;
    if(a1.num!=a2.num) return a1.num<a2.num;
}
int main()
{
    int t,m,n,i,j,temp,w,k=0,e,h,count;
    scanf("%d%d",&t,&m); /*t个班级,m次询问*/
    for(i=1;i<=t;i++) 
    {
       scanf("%d",&n); /*班级学生数*/
       for(j=1;j<=n;j++)
       {
         scanf("%d",&w); /*学生成绩*/
		 a[k].sco=w; /*第i个班级第j个学生的成绩*/
         a[k].clanum=i; /*第i个班级*/
		 a[k].num=j; /*第j个学生*/
		 k++;
       }
    }
    sort(a,a+k,comp); /*排序*/
    count=1; /*排名开始为1,即第一名*/
	h=a[0].sco; /*比较时的变量*/
	for(i=0;i<k;i++) /*把所有学生从头到尾遍历一次*/
	{
		if(a[i].sco!=h) /*不并列*/
		{
			h=a[i].sco; /*把这个学生的成绩设为比较时的变量*/
			count++; /*名次加1*/
		}
		a[i].rank=count; /*count记录名次*/
	}
	for(j=0;j<m;j++) /*m次查询*/
	{
		scanf("%d",&temp); /*要查询的排名*/
		for(i=0;i<k;i++)
		{
			int flag=0; /*0为还没有输出排名为temp的学生信息*/
			while(temp==a[i].rank) /*找到了排名为temp的学生,把这些学生信息一次输完*/
			{
				printf("%d %d\n",a[i].clanum,a[i].num);
				i++;
				flag=1; /*标记已经输出学生信息*/
			}
			if(flag) /*已经输出学生信息*/
				break;
		}
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值