search
时间限制:
1000
ms | 内存限制:
65535
KB
难度:
2
-
描述
-
游戏积分的排行榜出来了,小
z
想看看得某个积分的人是谁。但是由于人数很多,他自己找很浪费时间,所以他想请你帮忙写一个程序,能快速的帮他找到他想要找的人
-
输入
-
多组测试数据,第一行有一个数T,表示有T组测试数据(T<=50)
第二行有两个数n和m(1<=n,m<=10000),n表示有n个人,m表示有m次查询
接下来n行,输入每个人的名字(长度小于10)和积分num(0<=num<=10^8),
接下来m行,每个数表示要查询的积分(每次查询一定有结果)
输出
- 输出对应积分的人的名字(如果有多个人的积分相同,则输出最前面的那个) 样例输入
-
1 5 3 zhangsan 2 qianxiao 5 liuqiang 2 wangwu 1 lisi 3 2 1 3
样例输出
-
zhangsan wangwu lisi
来源
- 原创 上传者
- ACM_马振阳
- 提醒:注意细节,这道题因为一个小问题,卡了好久。
-
#include<iostream> #include<stdio.h> #include<algorithm> #include<cstring> using namespace std; /*结构体*/ struct node{ char name[15]; int v; }game[10010]; int cmp(node a,node b){ return a.v<b.v; } /*二分查找*/ int Binsearch(int l,int h,int k){ int mid; while(l<=h) { mid=(l+h)/2; if(k==game[mid].v) return mid; else if(k>game[mid].v) l=mid+1; else h=mid-1; } } int main() { int T,m,n,i,k,j; scanf("%d",&T); while(T--) { cin>>n>>m; for(i=0;i<n;i++) scanf("%s %d",&game[i].name,&game[i].v); stable_sort(game,game+n,cmp); for(i=0;i<m;i++) { scanf("%d",&j); k=Binsearch(0,n-1,j); while(k>0&&game[k-1].v==j) //判定条件,,,,,没太在意细节就是卡在了这里 k-=1; printf("%s\n",game[k].name); } } return 0; }
题中stable_sort(game,game+n,cmp);为稳定排序,需要调用cmp;具体介绍点击下面链接
-
-
多组测试数据,第一行有一个数T,表示有T组测试数据(T<=50)