秒速五厘米(快速二分跳跃查找答案)

**秒速五厘米(快速二分跳跃查找答案)
让我们来看这道题(题目来源:吉首大学)

#问题 D: 秒速五厘米
描述
樱花飘落的速度,每秒五厘米。
动漫《秒速五厘米》中,明里曾在信中写道“我家附近有棵很大的樱花树,到了春天,
那棵树上的花瓣,大概也会以每秒五公分的速度飘落,而我则在想,要是能和贵树一
起迎接春天的来临该有多好啊。”
来年春天,他们没能像约定那样一起迎接春天的到来,看樱花飘落。但有一个魔法,
可以让他们有m秒的时间一起看樱花飘落,樱花树上有n朵樱花,每朵樱花都有一个高度a[i],
樱花飘落的速度为v,樱花只能一朵一朵的飘落,如果某朵樱花飘落的时间不是整数,
则那朵樱花飘落所需的时间要向上取整,即,若两朵樱花的高度都为7,飘落的速度为2,
则两朵樱花飘落的时间为8,现在你可以控制樱花飘落的速度v,当v为何值时才能使所有的
樱花在m秒的时间内全部飘落且v的值要尽可能小。
格式
输入格式
第一行输入两个正整数n和m(1<=n<=m<=2000000)
第二行输入n个正整数a[i](1<=a[i]<=10000000),分别指的是每朵樱花的高度
输出格式
输出一个正整数v,代表樱花最合适的速度
样例
样例输入 Copy
2 10
5 6
样例输出 Copy
2
题解:该题数据过于庞大,不可能通过直接枚举得到,所以需要二分答案法;
但是测试时发现二分也超时了,最后我想出了两种方法。

第一种代码如下`

#include<bits/stdc++.h>
using namespace std;
long long b[10000010];
long n,m,maf;
bool check(long x)
{long i;long long sum=0,as=0; long ans=0; for(i=1;;i++){if(i!=1){sum=b[i*x-x];  //对于每个x,直接查找 i*x 到(i+1)*x之间的路程数as=b[i*x];     // 从而实现跳跃式的遍历}if(i*x>=maf){ans+=(b[maf]-sum)*i;break;}if(i==1) ans+=b[x];if(i!=1)ans+=(as-sum)*i;}if(ans>m) return false;else return true;
}
int main()
{while(scanf("%ld %ld",&n,&m)!=EOF){long long sum=0,mid,ans;for(long i=1;i<=n;i++){long f;scanf("%ld",&f);if(i==1) maf=f;else if(i!=1 && maf<f) maf=f;   // **找到最大的数,缩小桶的区间**b[f]++;                        // **桶装数**sum+=f;}for(long i=2;i<=maf;i++)b[i]+=b[i-1];              // **通过这步将每个b[i] 变为 小于等于i 的 路程个数之和**long r=sum,l=1; while(r>=l)            // **普通二分 没什么变化 重点在这个查找函数里面**{mid=(l+r)/2;if(check(mid)){ans=mid;r=mid-1;}else l=mid+1;}printf("%lld\n",ans);}return 0;
}

第二种方法

第二种方法的效率比第一种要低一些,重点在対二分剪枝

long r=maf,l=sum/m;    // **剪枝**while(r>=l) {mid=(l+r)/2;if(check(mid)){ans=mid;r=mid-1;}else l=mid+1;}

如果使用剪枝的话,可以直接遍历每一个数就行,不需要跳跃式遍历也可以AC,但是我觉得跳跃式更好一些。

二分## 二分

秒速五厘米(快速二分跳跃查找答案)相关推荐

  1. Java冒泡,快速,插入,选择排序^_^+二分算法查找

    这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get {public static voi ...

  2. 一万个数查找两个重复数,快速二分查找法 O(logN)(转)

    题目:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? 一.有序情况 ...

  3. Java1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4.至少使用两种方法进行编程,直接查

    1.使用二分搜索算法查找任意N个有序数列中的指定元素. 2.通过上机实验进行算法实现. 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告. 4.至少使用两种方法进行编程,直接查找/递归 ...

  4. Excel如何快速完成图片查找?

    ​ 1.如下图有一些图片和名称,现在我们想要快速完成图片查找 ​ 2.首先我们点击[图片工具]选项 ​ 3.选择[图片查找] ​ 4.接着我们分别录入图片区域和名称区域 ​ 5.最后我们勾选[同时调整 ...

  5. 高考数学快速解题法-必备快速高效(含答案解析)

    高考数学快速解题法-必备快速高效(含答案解析) 本文作者:vxbomath 考生们在高考数学中要掌握正确有效数学解题方法和解题技巧,快速高效 解决高中数学解题效率,拿到最高分. 好了,今天就分享到这里 ...

  6. 铨顺宏RFID工具跟踪管理系统,快速完成工具查找

    一.应用背景 RFID工具管理系统,快速完成工具查找!在各行各业中工具其实是一项重要不可或缺的资产.相关作业人员每天都要与工具打交道,怎么快捷便利的领用.归还,查找和保护这些工具,对企业管理来说是非常 ...

  7. POJ 3258 River Hopscotch(二分查找答案)

    一个不错的二分,注释在代码里 #include <stdio.h> #include <cstring> #include <algorithm> #include ...

  8. 黑马程序员 python快速编程入门课后答案_Python快速编程入门课后程序题答案

    前言 本文只是简单的整理了一下课后习题的编程题,具体的填空.选择.判断可以见:Python快速编程入门课后习题答案 第一章 1.编写一个Python程序,输出如下图效果. ++++++++++ +  ...

  9. Python - 排序( 插入, 冒泡, 快速, 二分 )

    插入排序 算法分析 两次循环, 大循环对队列中的每一个元素拿出来作为小循环的裁定对象 小循环对堆当前循环对象在有序队列中寻找插入的位置 性能参数 空间复杂度 O(1) 时间复杂度 O(n^2) 详细代 ...

最新文章

  1. SAP Business One和SAP All-in-One
  2. 母校/母语/母公司怎么说?
  3. foxmail地址簿怎么添加分组 foxmail地址簿新建分组的教程
  4. 软件工程(2018)第三次团队作业
  5. Linux sh/bash[精华]
  6. passwd: 鉴定令牌操作错误_user 及passwd 设置
  7. 灰常好的开源项目[c/c++]
  8. 【翻译】Ext JS 5的委托事件和手势
  9. 【无标题】java班级管理系统
  10. 两个月快速通过软考高项(信息系统项目管理师)备考技巧
  11. 用Python绘制标准时钟
  12. html半圆形效果图,html5 canvas半圆形百分比进度条动画特效
  13. chua系统matlab代码
  14. sap 流程图 退货销售订单_销售订单_退货及退回客户(采用高级退货)
  15. 春秋航空航班查询API
  16. 多对多业务,数据库水平切分架构一次搞定(58沈剑)
  17. 利用特征多项式计算矩阵的幂
  18. ExtraCHM 1.5破解版和破解教程:
  19. 项目四 个人所得税计算器
  20. 数字调制解调—MSK

热门文章

  1. Android音乐播放器——甩动切歌
  2. 三菱FX3U——ST编程CASE选择
  3. window8.1各种游戏不兼容
  4. 在非管理员权限下打开Mysql
  5. mysql 分库 框架_数据库水平分库框架设计
  6. 题目 2016: 新生的入队仪式
  7. 迅雷优酷争相效仿快播模式,为何一直超越不了3年前的快播?
  8. SAP MDG —— License的度量方式
  9. 实体映射工具-MapStruct使用详解
  10. 记录 ftpClient.listFiles(path) 没有反应