poj 1634

题意:给你m个员工,和n次的查询。

每个员工有他独立的id,收入,和身高

上司的收入一定大于下属的收入,身高也是大于等于下属的。

每个公司的头头没有上司,上司的编号为0,,同时他也是收入最多身高最高的人。

n次查询。

对于每一次查询,输出它对应的上司的其下属的个数。

Memory: 4572K		Time: 766MS
Language: C++		Result: Accepted
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

struct moreid{
    int id;
    int father;
    int son;
    int hight;
    int money;
}s[30005];
int id[1000000];  //这个数组是用来找id所对应的结构体的。

int cmp(const void *a,const void *b)   //根据收入的多少来进行排序。
{
    return(*(moreid *)a).money-(*(moreid *)b).money;
}

int main()
{
    int n,a,b,x;
    scanf("%d",&n);
    while(n--)
    {
        memset(id,0,sizeof(id));
        scanf("%d%d",&a,&b);
        for(int i=0;i<a;i++)
        {
            scanf("%d%d%d",&s[i].id,&s[i].money,&s[i].hight);
            s[i].son=0,s[i].father=0;    //对每个编号的下属和上司进行归零。
        }
        qsort(s,a,sizeof(s[0]),cmp);
        for(int i=0;i<a;i++)
        {
            id[s[i].id]=i;    //对结构体的编号的员工身份进行一一对应,用map也是可以的。
            for(int j=i+1;j<a;j++)
            {
                if(s[i].hight<=s[j].hight)    //如果身高要小于第一个钱比他高的人,那么那没人就是他的上司。
                {
                    s[i].father=s[j].id;  //记录上司
                    s[j].son+=s[i].son+1;   //上司的下属就是它的直属下属加上它下属的下属。
                    break;    //找到了直属后,记得跳出。
                }
            }
        }
        for(int i=0;i<b;i++)
        {
            scanf("%d",&x);
             printf("%d %d
",s[id[x]].father,s[id[x]].son);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Tree-dream/p/5582454.html