• nyoj86-找球号(一) 【set 二分查找 hash】


    http://acm.nyist.net/JudgeOnline/problem.php?pid=86

    找球号(一)

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,现在说一个随机整数k(0<=k<=100000100),判断编号为k的球是否在这堆球中(存在为"YES",否则为"NO"),先答出者为胜。现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利。
    输入
    第一行有两个整数m,n(0<=n<=100000,0<=m<=1000000);m表示这堆球里有m个球,n表示这个游戏进行n次。
    接下来输入m+n个整数,前m个分别表示这m个球的编号i,后n个分别表示每次游戏中的随机整数k
    输出
    输出"YES"或"NO"
    样例输入
    6 4
    23 34 46 768 343 343
    2 4 23 343
    
    样例输出
    NO
    NO
    YES
    YES
    解题思路A:set容器 find功能
    代码:
     1  #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <set>
     5 #include <algorithm>
     6 
     7 using namespace std;
     8 
     9 int main(){
    10     int m,n,t;
    11     set<int> se;
    12     set<int>::iterator it;
    13     scanf("%d %d",&m,&n);
    14     for(int i=0;i<m;i++){
    15         scanf("%d",&t);
    16         se.insert(t);
    17     }
    18     for(int i=0;i<n;i++){
    19         scanf("%d",&t);
    20         it=se.find(t);
    21         if(it==se.end())    puts("NO");
    22         else    puts("YES");
    23     }
    24     return 0;
    25 }
    26         
    View Code

    解题思路B:sort,二分查找

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <set>
     5 #include <algorithm>
     6 
     7 using namespace std;
     8 
     9 int am[1000005];
    10 int m,n,t;
    11 
    12 bool Find(int t);
    13 
    14 int main(){
    15     scanf("%d %d",&m,&n);
    16     for(int i=0;i<m;i++){
    17         scanf("%d",&am[i]);
    18     }
    19     sort(am,am+m);
    20     for(int i=0;i<n;i++){
    21         scanf("%d",&t);
    22         if(Find(t)) puts("YES");
    23         else    puts("NO");
    24     }
    25     return 0;
    26 }
    27 bool Find(int t){
    28     int l=0,r=m-1,mi;
    29     while(l<=r){
    30         mi=(l+r)/2;
    31         if(am[mi]==t)   return true;
    32         else if(am[mi]<t)   l=mi+1;
    33         else    r=mi-1;
    34     }
    35     return false;
    36 }
    View Code

    解题思路C:hash(借鉴别人的,待研究***)

    代码:

     1 #include <stdio.h>
     2 #define MAXN 3125010
     3 
     4 int vis[MAXN]={0};
     5 
     6 int main(){
     7     int m,n,x;
     8     int i;
     9     scanf("%d %d",&m,&n);
    10     for(i=0;i<m;i++){
    11         scanf("%d",&x);
    12         vis[x/32]|=1<<x%32;
    13     }
    14     for(i=0;i<n;i++){
    15         scanf("%d",&x);
    16         if(vis[x/32]&(1<<x%32)) printf("YES
    ");
    17         else    printf("NO
    ");
    18     }
    19     return 0;
    20 }
    View Code
  • 相关阅读:
    团队项目-第二阶段冲刺1
    第十四周总结
    第十三周总结
    程序员修炼之道阅读笔记02
    第十二周总结
    程序员修炼之道阅读笔记01
    Spring Boot 揭秘与实战 自己实现一个简单的自动配置模块
    Spring Boot 揭秘与实战 源码分析
    Spring Boot 揭秘与实战 源码分析
    Spring Boot 揭秘与实战(九) 应用监控篇
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4304527.html
Copyright © 2020-2023  润新知