二分查找

来源:互联网 发布:ubuntu 杀死进程 编辑:程序博客网 时间:2024/05/29 13:59

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行,每个数表示要查询的积分(每次查询一定有结果)
输出
输出对应积分的人的名字(如果有多个人的积分相同,则输出最前面的那个)
样例输入
15 3zhangsan 2qianxiao 5liuqiang 2wangwu 1lisi 3213
样例输出
zhangsanwangwulisi

解题思路:先按照积分从小到大排序,然后二分查找要查找的积分,判断这个人的积分和他前面的那个人的积分是否相同。如果不同,输出这个人的名字;否则,说明这个人不是第一个获得这个积分的人,再接着二分,直到找到一个不同的,输出即可。


  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<algorithm>  
  4. using namespace std;  
  5. struct score  
  6. {  
  7.     char name[11];  
  8.     int sco;  
  9. }a[10005];  
  10. bool comp(score a1,score a2)  
  11. {  
  12.     return a1.sco < a2.sco;  
  13. }  
  14. int Binary_search(int l, int r, int k)  
  15. {  
  16.     while(l < r)  
  17.     {  
  18.         int mid = (l + r) / 2;  
  19.         if(a[mid].sco > k)  
  20.             r = mid;  
  21.         else if(a[mid].sco < k)  
  22.             l = mid+1;  
  23.         else  
  24.         {  
  25.             if(a[mid].sco == a[mid - 1].sco)  
  26.                 r = mid;  
  27.             else  
  28.                 return mid;  
  29.         }  
  30.     }  
  31. }  
  32. int main()  
  33. {  
  34.     int t, n, m, i, k;  
  35.     scanf("%d",&t);  
  36.     while(t--)  
  37.     {  
  38.         scanf("%d%d",&n,&m);  
  39.         for(i = 0; i < n; i++)  
  40.             scanf("%s%d",a[i].name,&a[i].sco);  
  41.         stable_sort(a,a+n,comp);  
  42.         for(i = 0; i < m; i++)  
  43.         {  
  44.             scanf("%d",&k);  
  45.             int p = Binary_search(0,n,k);  
  46.             printf("%s\n",a[p].name);  
  47.         }  
  48.     }  
  49.     return 0;  

  1. }  


//顺便附上二分查找的方法
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100];
int binary(int l,int r,int k)
{
    while(l<r)
    {
        int mid=(l+r)/2;
        if(k>a[mid])
            l=mid+1;
        if(k<a[mid])
            r=mid;
        else
        {
            if(a[mid]==a[mid-1])
                r=mid;
            else
                return mid;
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int k;
    scanf("%d",&k);
    int p=binary(0,n,k);
    printf("a[%d]=%d\n",p,a[p]);
    return 0;
}

0 0