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>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define maxn 10000
 6 using namespace std;
 7 int a[maxn],b[maxn];
 8 int main()
 9 {
10     int n,m;
11     scanf("%d %d",&n,&m);
12     for(int i=0;i<n;i++)
13     {
14         scanf("%d",&a[i]);
15     }
16     for(int i=0;i<m;i++)
17     {
18         scanf("%d",&b[i]);
19     }
20     int ans=0;
21     for(int i=1;i<n;i++)
22     {
23         a[i]=min(a[i-1],a[i]);
24     }
25     for(int i=0;i<m;i++)
26     {
27         for(--n;n>=0&&a[n]<b[i];--n);//求出当前的盘子被卡在第几层
28             if(n>=0)
29             ans++;
30             else
31             break;//当盘子到达井口时跳出循环
32     }
33     printf("%d\n",ans);
34     return 0;
35 }
时间: 2024-11-01 19:59:27

1279 扔盘子(51nod)的相关文章

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

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;

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 扔盘子

题目传送门 这道题一开始写了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 单调栈

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

模板题+进阶

模板题: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 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

51Nod - 1381 硬币游戏

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