您的位置:首页 > 其它

search

2015-08-07 11:35 447 查看


NYOJ 904 search 二分查找

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



参考网址:/article/2442773.html

另外:table_sort的用法与sort一致,区别是stable_sort函数遇到两个数相等时,不对其交换顺序

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct person
{
char name[20];
int num;
};
person a[10005];
int cmp(person a,person b)
{
return a.num<b.num;
}
int dy(int l,int r,int c)
{
int mid;
while(l<r)
{
mid=(l+r)/2;
if(c>a[mid].num)
l=mid+1;
else if(c<a[mid].num)
{
r=mid;
}
else
{
if(a[mid].num==a[mid-1].num)
{
r=mid;
}
else
return mid;
}
}
}
int main()
{
int T,m,n,i,j,x;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%s%d",&a[i].name,&a[i].num);
// cin>>a[i].name>>a[i].num;
}
stable_sort(a,a+n,cmp);
for(i=0;i<m;i++)
{
scanf("%d",&x);
int p=dy(0,n,x);
printf("%s\n",a[p].name);
// cout<<a[p].name<<endl;
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: