放盘子

2024-03-11 01:20
文章标签 盘子

本文主要是介绍放盘子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击打开链接

有一口井,井的高度为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
输出最终落到井内的盘子数量。
Sample Input
7 5
5
6
4
3
6
2
3
2
3
5
2
4
Sample Output
4

题解:以井的深度通过变换得到一个有序数列,如5 6 4 3 6 2 3,第i个数用i以前的最小值代替,得5 5 4 3 3 2 2 ,调换顺序有2 2 3 3 4 5 5,再用二分查找(lower_bound)。

代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int INF=1e9+100;
int main()
{int m,n;int a[50004];int b[50004];while(scanf("%d%d",&m,&n)!=EOF){a[m+1]=INF;for(int i=0;i<m;i++){scanf("%d",&a[m-i]);a[m-i]=min(a[m-i+1],a[m-i]);}for(int i=1;i<=n;i++){scanf("%d",&b[i]);}int ant=0,aa=1;for(int i=1;i<n;i++){int tt=lower_bound(a+aa,a+m+1,b[i])-a;if(tt==m+1){break;}aa=tt+1;ant++;}printf("%d\n",ant);}
return 0;
} 







这篇关于放盘子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796137

相关文章

2015百度之星 放盘子

放盘子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 小度熊喜欢恶作剧。今天他向来访者们提出一个恶俗的游戏。他和来访者们轮流往一个正多边形内放盘子。最后放盘子的是获胜者,会赢得失败者的一个吻。玩了两次以后,小度熊发现来访

LeetCode——蜡烛间的盘子(前缀和+预处理)

题目 每日一题,今天抽到的题目是蜡烛间的盘子,题目要求如下: 给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s ,它只包含字符 '*' 和 '|' ,其中 '*' 表示一个 盘子 ,'|' 表示一支 蜡烛 。 同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示 子字符串 s[left

【汉诺塔问题】盘子的不停移动---汉诺塔算法的分析和实现

原问题为: 注:每次只能移动一个盘子,网上现有的汉诺塔问题中有些没有这个限制条件,因而可以使用同时移动上面的n-1个盘子来求解,相对比叫简单,而本题有次限制,因此需要特别注意!    图示: 如果自己苦思解法,未免有些困难,因此使用现有的比较成熟的算法思想,该算法来自百度百科,具体算法与链接如下所示: 算法介绍 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n –

划分数问题——盘子与小球——排列组合——递推式思维转化

0#引入 考试时遇到同球同盘的问题,一开始想用插板法,终究失败,只拿了20分,回家问了老师,老师告了我方法并让我自己研究剩下三种。 1#同球同盘——递推或递归(+记忆化改进优化) 这个我有真题http://www.kencoding.net/problem.php?id=1369,大家可以去做一下 我先把递推公式列在这里: (n是球数,m是盘子数) { f ( 0 , 0 ) = 1 f

移盘子用Java_1223: 输出汉诺塔问题的盘子移动步骤(Java)

一、题目 二、代码 import java.util.*; public class Main { Scanner in = new Scanner(System.in); int step, n;// step移动的步数,n盘子个数 /** * 构造方法 */ public Main() { while(in.hasNext()){ // 每次都重置为第一步 step = 1; // 输入盘子

c语言10个盘子,汉诺塔问题,当盘子个数为10时,hanoi函数一共被调用了几次?...

满意答案 指为武义人民 2020.04.09 采纳率:56%    等级:7 已帮助:259人 1023 可以设一个计数器 代码: #include "stdafx.h" #include using namespace std; int pp = 0; void move(char src, char dest) { cout << src << "-->" << dest << end

苹果放盘子的问题(动态规划)

牛客网 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 数据范围:0<=m<=10,1<=n<=10。 import java.util.*;public class Main{public static void main(String[] args){Scanner sc = new Scanner(

时隔3天,我终于理解了四个盘子的汉诺塔问题(Java实现)

目录 1.汉诺塔问题 2.思路讲解 2.1 一个盘子的情况。 2.2 两个盘子的情况 2.3 三个盘子的情况 3.四个盘子的汉诺塔问题 3.1 四个盘子的思路 3.2 实现代码来解决四个盘子的汉诺塔 1.汉诺塔问题 汉诺塔是啥大家都知道,汉诺塔的故事这里就不做介绍了,有读者感兴趣的可以去搜一搜,作者是用Java来实现的汉诺塔。 编程实现把 A 的 n 个盘子移动

二分/模拟-51Nod 1279-扔盘子

题目链接:1279扔盘子 题目大意: 盘子有几种命运:1、掉到井底。2、被卡住。3、落到别的盘子上方 思路: 如果简单的暴力会超时,对井的每一层可做优化。 如果上一层比下一层窄,那么盘子肯定在上一层被卡,所以不妨把下一层的宽度也设为上一层的宽度,以此,井由上至下会变成一个非递增序列,便于查找。 二分解法: 将井“倒过来”,变成一个非递减序列,设置一个下界,查找盘子所能落到的最底位置,

51Nod_1279 扔盘子【单调栈】

51Nod_1279 扔盘子                                       http://www.51nod.com/Challenge/Problem.html#!#problemId=1279   题目 有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井