题意:给你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\n",s[id[x]].father,s[id[x]].son); } } return 0; }
时间: 2024-10-14 14:05:59