• Gunner II(二分,map,数字转化)


    Gunner II

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1740    Accepted Submission(s): 635

    Problem Description
    Long long ago, there was a gunner whose name is Jack. He likes to go hunting very much. One day he go to the grove. There are n birds and n trees. The i-th bird stands on the top of the i-th tree. The trees stand in straight line from left to the right. Every tree has its height. Jack stands on the left side of the left most tree. When Jack shots a bullet in height H to the right, the nearest bird which stands in the tree with height H will falls.
    Jack will shot many times, he wants to know which bird will fall during each shot.
     
    Input
    There are multiple test cases (about 5), every case gives n, m in the first line, n indicates there are n trees and n birds, m means Jack will shot m times. 
    In the second line, there are n numbers h[1],h[2],h[3],…,h[n] which describes the height of the trees.
    In the third line, there are m numbers q[1],q[2],q[3],…,q[m] which describes the height of the Jack’s shots.
    Please process to the end of file.
    [Technical Specification]
    All input items are integers.
    1<=n,m<=100000(10^5)
    1<=h[i],q[i]<=1000000000(10^9)
     
    Output
    For each q[i], output an integer in a single line indicates the id of bird Jack shots down. If Jack can’t shot any bird, just output -1.
    The id starts from 1.
     
    Sample Input
    5 5 1 2 3 4 1 1 3 1 4 2
     
    Sample Output
    1 3 5 4 2
    Hint
    Huge input, fast IO is recommended.
     

    题解:这题就做的曲折了,刚开始一看不就是个hash表么,倒着记录下就好了,然而在tel和mel中,我放弃了。。。

    于是就想着二分了,对于已经用过的怎么办,再开个数组记录已经用过的,可是数组太大了啊,于是我用map来记录,可是是数字啊,木事木事,转化成string不就好了。。。想用stl里的二分类,但是是结构体啊,那就自己写。。。

    写完了,感觉很有可能wa,因为二分感觉写的有点挫,交了下竟然AC了。。。我只想笑。。

    AC代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<map>
    #include<string>
    using namespace std;
    const int INF=0x3f3f3f3f;
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define P_ printf(" ")
    #define mem(x,y) memset(x,y,sizeof(x))
    const int MAXN=1e5+100;
    struct Node{
        int v,num;
        bool operator < (const Node &b) const{
            if(v!=b.v){
                return v<b.v;
            }
            else return num<b.num;
        }
    };
    Node dt[MAXN];
    
    int main(){
        int n,m;
        while(~scanf("%d%d",&n,&m)){
            map<string,int>mp;
            for(int i=1;i<=n;i++)SI(dt[i].v),dt[i].num=i;
            sort(dt+1,dt+n+1);
            int x;
            sort(dt+1,dt+n+1);
            for(int i=0;i<m;i++){
                SI(x);
                char s[10];
                itoa(x,s,10);
                int l=1,r=n+1,mid;
                while(l<=r){
                    mid=(l+r)>>1;
                    if(x<=dt[mid].v)r=mid-1;
                    else l=mid+1;
                }
                if(dt[r+1+mp[s]].v==x){
                    printf("%d
    ",dt[r+1+mp[s]].num);
                    mp[s]++;
                }
                else puts("-1");
            }
        }
        return 0;
    }

    我的hash表,TLE了:(贡献了9次TLE,MLE)贴下吧

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 const int INF=0x3f3f3f3f;
     8 #define SI(x) scanf("%d",&x)
     9 #define PI(x) printf("%d",x)
    10 #define P_ printf(" ")
    11 #define mem(x,y) memset(x,y,sizeof(x))
    12 const int MAXN=5000010;
    13 int tp;
    14 int hsh[MAXN],head[MAXN],pos[MAXN],nxt[MAXN];
    15 int ans[100010];
    16 int q[100010];
    17 void add(int p,int x){
    18     int i=x%MAXN;
    19     hsh[tp]=x;
    20     pos[tp]=p;
    21     nxt[tp]=head[i];
    22     head[i]=tp++;
    23 }
    24 int main(){
    25     int n,m;
    26     while(~scanf("%d%d",&n,&m)){
    27         int x;
    28         mem(head,-1);tp=0;
    29         mem(nxt,0);mem(hsh,0);
    30         for(int i=1;i<=n;i++){
    31             scanf("%d",&x);add(i,x);
    32         }
    33         for(int i=1;i<=m;i++)scanf("%d",&q[i]);
    34         for(int i=m;i>=1;i--){
    35                 x=q[i];
    36             int flot=0;
    37             for(int j=head[x%MAXN];j!=-1;j=nxt[j]){
    38                 if(x==hsh[j]){
    39                     ans[i]=pos[j];
    40                     flot=1;
    41                     hsh[j]=0;break;
    42                 }
    43             }
    44             if(!flot)ans[i]=-1;
    45         }
    46         for(int i=1;i<=m;i++)printf("%d
    ",ans[i]);
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    主流软件系统类别
    vue 生命周期
    redis 实现多属性查询
    业务逻辑层缓存设计
    ORM 缓存
    keepalived+nginx实现niginx高可用,宕机自动重启
    cookie sessionstorge localstorge 的比较
    css 定位
    2019年1月2日 生产者消费者模型 元旦快乐
    2018年12月25日 圣诞节快乐 生成器plus
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5246103.html
Copyright © 2020-2023  润新知