• 扔盘子


    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279

    题目:

    有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。
    盘子有几种命运:1、掉到井底。2、被卡住。3、落到别的盘子上方。
    盘子的高度也是单位高度。给定井的宽度和每个盘子的宽度,求最终落到井内的盘子数量。
     
     
    如图井和盘子信息如下:
    井:5 6 4 3 6 2 3
    盘子:2 3 5 2 4
     
    最终有4个盘子落在井内。
    本题由 @javaman 翻译。
    Input
    第1行:2个数N, M中间用空格分隔,N为井的深度,M为盘子的数量(1 <= N, M <= 50000)。
    第2 - N + 1行,每行1个数,对应井的宽度Wi(1 <= Wi <= 10^9)。
    第N + 2 - N + M + 1行,每行1个数,对应盘子的宽度Di(1 <= Di <= 10^9)
    Output
    输出最终落到井内的盘子数量。
    Input示例
    7 5
    5
    6
    4
    3
    6
    2
    3
    2
    3
    5
    2
    4
    Output示例
    4



    分析:
    题目的意思很好理解;

    用题目的例子说明
    从上到下的宽度是:5 6 4 3 6 2 3,但是我们要想到如果一个盘子的宽度如果为6,是进不来的,那我们就可以把第二层看成5,以此类推,从上到下就可以写成5 5 4 3 3 2 2,最后利用lower_bound函数二分求解。
     
    AC代码:
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #define N 50010
    #define M 1000000005
    using namespace std;
    typedef long long ll;
    ll a[N],b[N];
    int main()
    {
        ll n,m,maxn=M;
        cin>>n>>m;
        for (ll i=0;i<n;i++)
        {
            cin>>a[n-i-1];
            maxn=min(a[n-1-i],maxn);
            a[n-i-1]=maxn;
        }
        for (ll i=0;i<m;i++)
           cin>>b[i];
           ll sum=0,t,k=0;
        for (ll i=0;i<m;i++)
        {
            t=lower_bound(a+k,a+n,b[i])-a;
            if (t==n)
                break;
            else
                k=t+1,sum++;
        }
        cout << sum << endl;
        return 0;
    }
  • 相关阅读:
    [转载].net 访问oracle的总结
    .net平台新语言——Boo 试用
    抛弃ConfigurationManager , 实现面向对象读写配置文件
    延长或控制Session的有效期的方法总结
    jQuery Validation:让验证变得如此容易
    单进程资源共享
    .net快速创建PDF文档 by c#
    百度之星程序设计大赛初赛题4低频词过滤
    Google Talk
    百度之星,我的比赛结束了:)
  • 原文地址:https://www.cnblogs.com/lisijie/p/7647421.html
Copyright © 2020-2023  润新知