• 51 nod 1279 扔盘子(思维好题)


    题目来源: Codility
    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
    收藏
    关注
    取消关注
    有一口井,井的高度为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

    分析:将井的宽度等效转换成一个递减的序列.若一个盘子过不了第i高度的井口,那么肯定过不了第i+1高度的井口,所以第i+1高度的井口可等效为a[i+1]=min(a[i+1],a[i]).
    然后枚举盘子与井口宽度比较并更新井口区间即可.

    并不一定要用二分,暴力枚举也可以的.


    STL:
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,m;
    int a[50005];
    int main()
    {
        ios::sync_with_stdio(false);
        while(cin>>n>>m)
        {
            cin>>a[0];
            for(int i=1;i<n;i++)
            {
                cin>>a[i];
                a[i]=min(a[i],a[i-1]);
            }
            int ans=0,now=n-1;
            for(int i = 0; i < m; i++)
            {
                int tmp;
                cin>>tmp;
                if(now<0)
                    continue;
                while(a[now]<tmp)
                    now--;
                if(now>=0)
                {
                    ans++;
                    now--;
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 int n,m;
     5 int a[50005];
     6 int p[50005];
     7 int main()
     8 {
     9     ios::sync_with_stdio(false);
    10     while(cin>>n>>m)
    11     {
    12         cin>>a[0];
    13         for(int i=1;i<n;i++)
    14         {
    15             cin>>a[i];
    16             a[i]=min(a[i],a[i-1]);
    17         }
    18         reverse(a,a+n);
    19         int start=0,ans=0,flag=0;
    20         for(int i=0;i<m;i++)
    21         {
    22             int tmp;
    23             cin>>tmp;
    24             if(flag)
    25                 continue;
    26             int pos=lower_bound(a+start,a+n,tmp)-(a);
    27             if(pos<n)
    28                 ans++,start=pos+1;
    29             else
    30                 flag=1;
    31         }
    32         cout<<ans<<endl;
    33     }
    34     return 0;
    35 }

    暴力枚举:

     
  • 相关阅读:
    [其他]JAVA与C#的Socket通信
    Ext 向Ext.form.ComboBox()中添加列表的分类
    Extjs tree 过滤查询功能
    Extjs TreePanel API详解
    JVM虚拟机21: 1.8中废弃永久代(PermGen)迎来元空间(Metaspace)
    JVM虚拟机20:内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)
    Java虚拟机19:再谈四种引用状态
    Java虚拟机18:Java对象大小、对象内存布局及锁状态变化
    Java虚拟机17:互斥同步、锁优化及synchronized和volatile
    Java虚拟机16:Java内存模型
  • 原文地址:https://www.cnblogs.com/onlyli/p/7297646.html
Copyright © 2020-2023  润新知