您的位置:首页 > 其它

NYOJ.904 search(二分查找,快速排序,结构体运用)

2013-12-01 11:35 363 查看


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<stdio.h>

#include<iostream>

#include<algorithm>

struct score

{

char name[15];

int b;

}stu[10010];

bool cmp(score a1,score a2)//一定得将 结构体中的数据引出

{

return a1.b<a2.b;

}

int bin_search(score s[],int a,int n)//二分查找

{

int l,r,mid;

l=0;r=n-1;

while(l<=r)

{

mid=(l+r)/2;

if(s[mid].b==a)

return mid;

if(s[mid].b>a)//中值大于所找值

r=mid-1;

else////中值小于所找值

l=mid+1;

}

return -1;

}

int main()

{

int t,n,m;scanf("%d",&t);

while(t--)

{

scanf("%d%d",&n,&m);

for(int i=0;i<n;i++)//输入结构体数据

scanf("%s%d",stu[i].name,&stu[i].b);

std::stable_sort(stu,stu+n,cmp);//快速排序,必须得引用cmp

while(m--)

{

int a;

scanf("%d",&a);

int k=bin_search(stu,a,n);

while(k-1>=0&&stu[k-1].b==a)//如果有多个人的积分相同,则输出最前面的那个

k--;

printf("%s\n",stu[k].name);

}

}

return 0;

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