51nod 1279 扔盘子

题目链接在这儿

如果上面一层窄,下面再宽也没用。

那么可以根据输入获得一个单调的栈,这个栈是经过选择的。比如输入例子的5 6 4 3 6 2 3,将变成5 5 3 3 3 2 2 。最后一层为栈顶,接着来一个盘子判断栈顶(亦即坑底部)能否容纳,不可则出栈再判断,可则认为放置这个盘子入这层,这层消失。统计一下放置了多少次即可。

#include <bits/stdc++.h>
using namespace std;

const int maxN = 1e5 + 5;

int N, M, S;
int stk[maxN], p;

int main() {
#ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
#endif
    scanf("%d%d", &N, &M);
    p = 0;
    for (int i = 0; i < N; ++i) {
        scanf("%d", &S);
        if (p)
            stk[p] = min(stk[p - 1], S);
        else
            stk[p] = S;
        ++p;
    }
    int ans = 0;
    for (int i = 0; i < M; ++i) {
        scanf("%d", &S);
        while (p && stk[p - 1] < S)
            --p;
        if (!p)
            break;
        ++ans;
        --p;
    }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Rosebud/p/9520321.html

时间: 2024-10-30 02:01:25

51nod 1279 扔盘子的相关文章

51NOD 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中间用空格分隔,

1279 扔盘子(51nod)

题目链接 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 这道题要求的就是当顶被封之前有多少盘被扔下去= =当顶被封住时 即使下面的盘子再小也不能扔下去 我们用a[]保存井的宽度,数组b[]来保存盘子的大小 首先盘子j要是能到达第i米,则需要满足min(a[0~i])>=b[j]; 所以我们只需保存最小值便可 1 #include<stdio.h> 2 #include<string.h>

51 nod 1279 扔盘子

有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去). 盘子有几种命运:1.掉到井底.2.被卡住.3.落到别的盘子上方. 盘子的高度也是单位高度.给定井的宽度和每个盘子的宽度,求最终落到井内的盘子数量. 如图井和盘子信息如下: 井:5 6 4 3 6 2 3 盘子:2 3 5 2 4 最终有4个盘子落在井内. Input 第1行:2个数N, M中间用空格分隔,N为井的深度,M为盘子的数量(1 <= N

1279 扔盘子

思路:先将井口处理成递增的序列,然后再二分每个盘子插入的位置. 1 #include <iostream> 2 #include <queue> 3 #include <stack> 4 #include <cstdio> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <bitset> 9 #include <algori

51nod 1279 单调栈

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 1279 扔盘子 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 有一口井,井的高度为N,每隔1个单位它的宽度有变化.现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去). 盘子有几种命运:1.掉到井底.2.被卡住.3.落到别的盘子上方. 盘子

51nod 扔盘子

题目传送门 这道题一开始写了n方的算法 果不其然 它T了 所以就想想o(n)的算法 写不出来 就像sbzhq学习了一下 这道题啊 要维护一下从深度1到n每一段的最小值以及他的位置 然后就暴力搞一搞就okay 啦!!! #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf=1e9+7; int read(){ int ans=0,f=1,c=get

51Nod 1279

上一层a窄于下一层b,则盘子c>a&&c<b时,是到达不了b的,所以预处理井,a<b时,b=a; 这时,井就成了一个上宽下窄的井,从下开始比较,盘子的卡到一个位置,那这里之下的井就不用再看了. 1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 using namespace std; 6 int main

模板题+进阶

模板题:2500 后面第一个大于 一般要正着看不出来,反着想,有的人也叫做正难则反. 有思维的一道题:1279 扔盘子 暴力会TLE 数据有点水,反着写的可以拿95% 1 //垃圾数据从井底倒着网上数盘子居然能过19个测试点 2 //但是提供给我们一种思路就是,明知道正着肯定会错时逆向解题也许能拿更多的分 3 #include<bits/stdc++.h> 4 using namespace std; 5 const int maxN=50005; 6 int n, m; 7 int w[ma

51Nod - 1381 硬币游戏

51Nod - 1381 硬币游戏 有一个简单但是很有趣的游戏.在这个游戏中有一个硬币还有一张桌子,这张桌子上有很多平行线(如下图所示).两条相邻平行线之间的距离是1,硬币的半径是R,然后我们来抛硬币到桌子上,抛下之后硬币有时候会和一些直线相交(相切的情况也算是相交),有时候不会. 请你来计算一下抛一次硬币之后,该硬币和直线相交数目的期望. Input 第一行给出一个整数T,表示有T组数据(1<=T<=10000). 第2行到T+1,每行给出一个整数R.(0< R <= 10,00