• nyist 240 小明的调查统计(二)


    http://acm.nyist.net/JudgeOnline/problem.php?pid=240

    小明的调查统计(二)

    时间限制: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代码:
    直接排序:
     1  
     2 #include<stdio.h>
     3 #include<algorithm>
     4 using namespace std;
     5 int main()
     6 {
     7     int T,M,N;
     8     int i,j,k,max=0;
     9     int b[200]={0},a[500][200]={0};
    10     int num=0;
    11     scanf("%d %d",&T,&M);
    12     for(i=0;i<T;i++)
    13     {
    14         scanf("%d",&N);
    15         if(max<N) max=N;
    16         for(j=0;j<N;j++) 
    17         {
    18             scanf("%d",&a[i][j]);
    19             int t=0;
    20             for(k=0;k<num;k++)
    21             if(a[i][j]==b[k]) t=1;
    22             if(t==0)
    23                 {b[num]=a[i][j];num++;}
    24         }
    25     }
    26     sort(b,b+num);
    27     while(M--)
    28     {
    29         int n;
    30         scanf("%d",&n);
    31         for(i=0;i<T;i++)
    32         for(j=0;j<max;j++)
    33         if(a[i][j]==b[num-n])
    34         printf("%d %d
    ",i+1,j+1);
    35     }
    36     return 0;
    37 }
    View Code

    结构体排序:

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 struct data//data保存输入数据用
     6 {
     7     int number;//人数
     8     int *p;//学生成绩
     9 };
    10 
    11 struct one
    12 {
    13     int c;//班级
    14     int zb;//学号
    15     int z;//成绩
    16     int w;//名次
    17 };
    18 
    19 //自定义sort排序,先按分数从大到小,再按班级从小到大,再按学号从小到大
    20 bool cmp(one a,one b)
    21 {
    22     if(a.z!=b.z)return a.z>b.z;
    23     if(a.c!=b.c)return a.c<b.c;
    24     return a.zb<b.zb;
    25 }
    26 int main()
    27 {
    28     data *s;
    29     one x[100010];
    30     int t,m,i,j,k=0;
    31     cin>>t>>m;
    32     s=new data[t];
    33     for(i=0; i<t; i++) //输入数据
    34     {
    35         cin>>s[i].number;
    36         s[i].p=new int[s[i].number];
    37         for(j=0; j<s[i].number; j++)
    38         {
    39             cin>>s[i].p[j];
    40             x[k].zb=j+1;
    41             x[k].z=s[i].p[j];
    42             x[k].c=i+1;
    43             k++;
    44         }
    45     }
    46     sort(x,x+k,cmp);
    47     int count=1,h=x[0].z,temp;
    48     for(i=0; i<k; i++) //循环,排序分数名次
    49     {
    50         if(x[i].z!=h)
    51         {
    52             h=x[i].z;
    53             count++;
    54         }
    55         x[i].w=count;
    56     }
    57     while(m--)
    58     {
    59         cin>>temp;
    60         for(i=0; i<k; i++)
    61         {
    62             if(temp==x[i].w) cout<<x[i].c<<" "<<x[i].zb<<endl;
    63             if(x[i].w>temp) break;
    64         }
    65     }
    66     return 0;
    67 }
    View Code
    悠游天地间 all rights reserved. © 2013 -- 1 << 64
  • 相关阅读:
    Integer值判断是否相等问题
    Java连接Redis
    oracle 10G 没有 PIVOT 函数怎么办,自己写一个不久有了
    前端修炼(第三天)函数
    前端 JS 修炼(第一天)包装对象、作用域、创建对象
    linux oracle 启动全过程
    「android」webview中文乱码
    「dos」bat单条命令跨多行
    「股票」东方财富网公式-缩量
    「android」as javadoc乱码
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/3249039.html
Copyright © 2020-2023  润新知