nyoj-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
來源
[路過這]原創
上傳者

路過這


#include<iostream>//結構體排序
#include<algorithm>
#include<cstdio>
using namespace std;
struct stu
{
    int ban;//班級號
    int xue;//學號
    int chen;//成績
} a[100000+100];

bool cmp(const stu& a,const stu& b)//結構體排序
{
    if(a.chen==b.chen&&a.ban==b.ban)
        return a.xue<b.xue;
    if(a.chen==b.chen&&a.ban!=b.ban)
        return a.ban<b.ban;
    return a.chen>b.chen;
}

int main()
{
    int t,m,n,p=1,q,xun;
    cin>>t>>m;
    for(int i=1; i<=t; i++)//依次讀取數據進結構體
    {
        scanf("%d",&n);
        for(int j=p; j<p+n; j++)// p用來累計人數和標記數組保存到的位置
        {
            scanf("%d",&q);
            a[j].chen=q;
            a[j].ban=i;
            a[j].xue=j-p+1;
        }
        p+=n;
    }
    sort(a+1,a+p,cmp);
    int b[100000+100]= {0},c=1;//用數組b來去除成績重複,得到一個無重複的排好序的數組
    for(int i=1; i<p; i++)
    {
        if(a[i].chen!=a[i+1].chen)
            b[c++]=a[i].chen;
    }
    for(int i=1; i<=m; i++)
    {
        scanf("%d",&xun);//詢問名次
        for(int j=1; j<p; j++)
        {
            if(a[j].chen==b[xun])//利用排好序的數組找到要輸出的數據
                printf("%d %d\n",a[j].ban,a[j].xue);
        }
    }
    return 0;
}


發佈了189 篇原創文章 · 獲贊 30 · 訪問量 160萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章