标签:
题目链接:http://poj.org/problem?id=1634
思路:按照工资从小到大排好,找到最近的那个身高较高的人。
有一点要注意的是,这里有个根节点,大boss,他的id是0,因此,我这里的num初始化为1,到时候减去1就是了,但是对于大boss就不一样了,减1就是0咯。
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 30005; struct Staff { int id,salary,h; }staff[maxn]; int n,m; int ind[1000000]; int num[maxn]; int fa[maxn]; bool cmp(struct Staff a,struct Staff b) { return a.salary<b.salary; } int main() { int t; scanf("%d",&t); while(t--) { memset(fa,0,sizeof(fa)); for(int i=1;i<maxn;i++) num[i] = 1; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d%d",&staff[i].id,&staff[i].salary,&staff[i].h); sort(staff+1,staff+n+1,cmp); for(int i=1;i<=n;i++) { ind[staff[i].id]=i; for(int j=i+1;j<=n;j++) { if(staff[j].h>=staff[i].h) { fa[i]=j; num[j]+=num[i]; break; } } } for(int i=1;i<=m;i++) { int id; scanf("%d",&id); int u=ind[id]; printf("%d %d\n",staff[fa[u]].id,num[u]-1); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/TreeDream/p/5611762.html