A-A+

小明的调查统计(二)

2012年10月05日 acm水题 暂无评论 阅读 35 次

小明的调查统计(二)

时间限制: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

这一题不是很水!思路要清晰,国庆回来第二水!已加标注!给大家解释一下!请把注释的代码去掉,否则会超时!超时!超时!超时!
[cpp]
#include <iostream>
#include <algorithm>
using namespace std;
struct data//data保存输入数据用
{
int number;//人数
int *p;//学生成绩
};
struct one
{
int c;//班级
int zb;//学号
int z;//成绩
int w;//名次
};
//自定义sort排序,先按分数从大到小,再按班级从小到大,再按学号从小到大
bool cmp(one a,one b)
{
if(a.z!=b.z)return a.z>b.z;
if(a.c!=b.c)return a.c<b.c;
return a.zb<b.zb;
}
int main()
{
data *s;one x[100010];
int t,m,i,j,k=0;cin>>t>>m;
s=new data[t];
for(i=0;i<t;i++)//输入数据
{
cin>>s[i].number;
s[i].p=new int.number];
for(j=0;j<s[i].number;j++) {cin>>s[i].p[j];x[k].zb=j+1;x[k].z=s[i].p[j];x[k].c=i+1;k++;}
}
sort(x,x+k,cmp);
int count=1,h=x[0].z,temp;
for(i=0;i<k;i++)//循环,排序分数名次
{
if(x[i].z!=h) {h=x[i].z;count++;}x[i].w=count;
}
while(m--)
{
cin>>temp;
for(i=0;i<k;i++)
{
if(temp==x[i].w) cout<<x[i].c<<" "<<x[i].zb<<endl;
if(x[i].w>temp) break;
}
}
delete[] s;
return 0;
}
[/cpp]

标签:

给我留言

Copyright © C/C++程序员之家 保留所有权利.   Theme  Ality 浙ICP备15011757号-3

用户登录