• Gunner II--hdu5233(map&vector/二分)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5233

    题意:有n颗树,第 i 棵树的高度为 h[i],树上有鸟,现在这个人要打m次枪,每次打的高度是 q[i], 求每次

    打枪能打下鸟的编号,否则输出-1 ;

    STL中的map和vector:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <map>
    
    using namespace std;
    
    #define met(a, b) memset(a, b, sizeof(a))
    #define INF 0x3f3f3f3f
    #define N 100010
    
    int dir[8][2] = { {1,0}, {-1,0}, {0,1}, {0,-1}, {1,1}, {1,-1}, {-1,1}, {-1,-1} };
    
    
    int n, m, h[N], q[N];
    
    map<int, vector<int> > mp;
    
    int main()
    {
        while(scanf("%d %d", &n, &m) != EOF)
        {
            mp.clear();
            
            for(int i=1; i<=n; i++)
    
                scanf("%d", &h[i]);
        
            for(int i=n; i>=1; i--)
                
                    mp[h[i]].push_back(i);
                
            for(int i=1; i<=m; i++)
            {
                scanf("%d", &q[i]);
                
                if(mp[q[i]].size()>=1)
                {
                    printf("%d
    ", mp[q[i]].back());
                    
                    mp[q[i]].pop_back();
                }
                else
                
                    printf("-1
    ");
            }
        }
        return 0;
    }
    View Code

    二分:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <map>
    
    using namespace std;
    
    #define met(a, b) memset(a, b, sizeof(a))
    #define INF 0x3f3f3f3f
    #define N 100010
    
    int dir[8][2] = { {1,0}, {-1,0}, {0,1}, {0,-1}, {1,1}, {1,-1}, {-1,1}, {-1,-1} };
    
    struct node
    {
        int num, Id;
    }h[N];
    
    int n, m, q[N], vis[N];
    
    int cmp(node a, node b)
    {
        if(a.num!=b.num)
            return a.num < b.num;
        return a.Id < b.Id;
    }
    
    int BeSearch(int L, int R, int num)
    {
        int ans = -1;
        
        while(L <= R)
        {
            int Mid = (L+R)/2;
            
            if(num == h[Mid].num)
            {
                if(!vis[Mid])
                {
                    ans = Mid;
                    
                    R = Mid - 1;///先输出最左边的;
                }
                else
                    L = Mid + 1;
            }
            else if(h[Mid].num > num)
                
                R = Mid - 1;
            else
                
                L = Mid + 1;
        }
        if(ans != -1)
        {
            vis[ans] = 1;
            return h[ans].Id;
        }
        return -1;
    }
    
    int main()
    {
        while(scanf("%d %d", &n, &m) != EOF)
        {
            met(vis, 0);
            met(h, 0);
            met(q, 0);
    
            for(int i=0; i<n; i++)
            {
                scanf("%d", &h[i].num);
               
                h[i].Id = i+1;
            }
    
            sort(h, h+n, cmp);
    
            for(int i=1; i<=m; i++)
            {
                scanf("%d", &q[i]);
    
                int pos = BeSearch(0, n, q[i]);
    
                printf("%d
    ", pos);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    mac 个人账户环境变量位置
    版本控制工具Git
    xmind导图用例转换为表格用例
    Mysql清空表(truncate)与删除表中数据(delete)的区别
    log4j日志级别及使用规范
    洛谷 P3807 【模板】卢卡斯定理
    jmeter环境配置与java环境配置
    NOI2020乱搞记
    Re:ゼロから始める文化課生活
    阅读书单
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/5248515.html
Copyright © 2020-2023  润新知