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 <algorithm>
10 #include <cmath>
11 #include <cstring>
12 #include <cstdlib>
13 #include <string>
14 #include <sstream>
15 #include <time.h>
16 #define x first
17 #define y second
18 #define pb push_back
19 #define mp make_pair
20 #define lson l,m,rt*2
21 #define rson m+1,r,rt*2+1
22 #define mt(A,B) memset(A,B,sizeof(A))
23 #define mod 1000000007
24 using namespace std;
25 typedef long long LL;
26 const double PI = acos(-1);
27 const int N=1e5+10;
28 const int inf = 0x3f3f3f3f;
29 const LL INF=0x3f3f3f3f3f3f3f3fLL;
30 int w[N],D[N];
31 int main()
32 {
33 #ifdef Local
34     freopen("data.txt","r",stdin);
35 #endif
36     int n,m,ans=0;
37     cin>>n>>m;
38     for(int i=0;i<n;i++)cin>>w[i];
39     for(int i=0;i<m;i++)cin>>D[i];
40     for(int i=1;i<n;i++)
41     {
42         if(w[i]>w[i-1])w[i]=w[i-1];
43     }
44     sort(w,w+n);
45     w[n]=inf;
46     for(int i=0,k=0;i<m;i++)
47     {
48         k=lower_bound(w+k,w+n+1,D[i])-w+1;
49         if(k>n)break;
50         ans++;
51     }
52     cout<<ans<<endl;
53 #ifdef Local
54     cerr << "time: " << (LL) clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;
55 #endif
56 }

时间: 2024-10-10 03:32:44

1279 扔盘子的相关文章

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

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>

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;

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

m个苹果放入n个盘子问题

问题一 问题描述:把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问有多少种不同的分法?(注:5,1,1和1,1,5是同一种分法) 解题分析: 设f(m,n)为m个苹果,n个盘子的放法数目,则先对n作讨论, 当n>m:则必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响.即 if(n>m) f(m,n) = f(m,m) 当n <= m:不同的放法可以分成两类:含有0的方案数,不含有0的方案数 1.含有0的方案数,即有至少一个盘子空着,即相当于 f(m,n)=f

盘子序列

盘子序列  [题目描述]  有 n 个盘子.盘子被生产出来后,被按照某种顺序摞在一起.初始盘堆中如果一  个盘子比所有它上面的盘子都大,那么它是安全的,否则它是危险的.称初始盘堆为  A,另外有一个开始为空的盘堆 B.为了掩盖失误,生产商会对盘子序列做一些“处  理”,每次进行以下操作中的一个:(1)将 A 最上面的盘子放到 B 最上面:(2)将 B 最上  面的盘子给你.在得到所有 n 个盘子之后,你需要判断初始盘堆里是否有危险的盘子.  [输入格式]  输入文件包含多组数据(不超过 10 组