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 }

 

暴力枚举:

 

 
posted @ 2017-08-07 09:42  只有你  阅读(181)  评论(0编辑  收藏  举报