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;
}
相关文章推荐
- NYOJ 904 search 二分查找
- 快速排序 和 二分查找
- 黑马程序员——冒泡排序、选择排序、二分查找的实例运用分析
- 归并排序、插入排序、快速排序、二分查找的c++实现
- 快速排序与二分查找
- #1133 : 二分·二分查找之k小数 ( 快速排序, 分治 OR nth_element() 函数)
- 给大家分享下:快速排序、冒泡排序、二分查找
- 数组 获取最值(最大值 最小值)选择排序 冒泡排序 快速排序 半查找(二分查找) 十进制转其他进制法
- 2013 0314 二分查找 快速排序 空间复杂度
- 第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序
- 插入,冒泡,选择,快速排序,二分查找
- 快速排序 约瑟夫问题 顺序查找 二分查找
- 拓扑排序, 快速排序, 冒泡排序, 堆排序, 二分查找
- 插入,冒泡,选择,快速排序,二分查找(Java版)
- 快速排序和二分查找的练习
- 2015/10/06写下的归并排序、快速排序、二分查找
- 快速排序和二分查找的练习
- 算法---冒泡排序,快速排序,二分查找(折半查找),选择排序,插入排序
- 各种排序方法(冒泡,快速,插入,选择),二分查找
- 码农小汪剑指Offer之35-数字在排序数组中出现的次数 暴力 二分查找的运用