zoukankan      html  css  js  c++  java
  • (转)upper_bound()与lower_bound()使用方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<iostream>
    #include<algorithm>//必须包含的头文件
    #include<cstdio>
    using namespace std;
    int main()
    {
        int point[10] = {1,3,7,7,9};
        int tmp = upper_bound(point, point + 5, 7) - point;//按从小到大,7最多能插入数组point的哪个位置
        printf("%d ",tmp);
        tmp = lower_bound(point, point + 5, 7) - point;    //按从小到大,7最少能插入数组point的哪个位置
        printf("%d ",tmp);
        return 0;
    }

    可以当二分查找用

    应用:Anton and Making Potions   http://codeforces.com/contest/734/problem/C

    描述:

         1.处理N个potions,一个需要耗费x时间。

        2.初始有n个potions,需要消耗x时间,魔法值有s。

        3.有两种类型魔法:一种可以减少时间、一种可以减少处理数。

        4.分别输入两大类魔法的不同型号效果和消耗魔法值。

        5.两种魔法各选择0或1个型号,使得总消耗的时间最短。

    思路:枚举第一种魔法,二分查找第二种不超过最大cost值的数即为最优值(贪心)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<map>
    #define ll long long
    using namespace std;
    struct T
    {
        ll fun,cost;
    }t1[200010],t2[200010];
    bool cmp(const T &a,const T &b){return a.cost<b.cost;}
    int main()
    {
        ll n,m,k;
        int i,j;
        while(~scanf("%I64d%I64d%I64d",&n,&m,&k))
        {
            ll x,s;
            scanf("%I64d%I64d",&x,&s);
            for(i=1;i<=m;i++)
                scanf("%I64d",&t1[i].fun);
            for(i=1;i<=m;i++)
                scanf("%I64d",&t1[i].cost);
            for(i=1;i<=k;i++)
                scanf("%I64d",&t2[i].fun);
            for(i=1;i<=k;i++)
                scanf("%I64d",&t2[i].cost);
            ll res=n*x;
            ll cost;
            t2[0].cost=-1;
            for(i=1;i<=m;i++)
            {
                cost=t1[i].cost;
                if(cost>s)continue;
                T a;
                a.cost=s-cost;
                int pos=upper_bound(t2,t2+k+1,a,cmp)-t2-1;
                if(pos==0){res=min(res,n*t1[i].fun);continue;}
                ll num=n-t2[pos].fun;
                if(num<=0){res=0;break;}
                else res=min(res,num*t1[i].fun);
            }
            for(i=1;i<=k;i++)
            {
                if(t2[i].cost>s)continue;
                ll num=n-t2[i].fun;
                if(num<=0){res=0;break;}
                else res=min(res,num*x);
            }
            printf("%I64d ",res);
        }
    }
  • 相关阅读:
    【Android-功能】Android应用增量更新
    【android-音视频】listview中播放音频,实现音频时长的倒计时,暂停,切换。
    Mysql中的DQL查询语句
    DDL、DML和DCL的理解
    WIN2000 XP 2003系统密码破解方法
    ASP.NET开发学习视频教程大全(共800集)
    VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
    正则表达式-RegExp-常用正则表达式
    20151216
    20151124-数据类型
  • 原文地址:https://www.cnblogs.com/bestwzh/p/6072263.html
Copyright © 2011-2022 走看看