清北学堂第一题 游乐园 SmartOJ 1815(二分查找的精髓)
本人原创日志,允许转载,但请注明出处,谢谢!
题目描述
游乐园里新推出一个游戏——飞机驾驶体验。有N-1个小朋友来玩这个游戏,他们排成长长的一列。这个游戏一共有M架“飞机”可供驾驶,每架飞机的使用时间都是有限制的,第i架“飞机”的使用时间是si分钟。
一开始所有“飞机”都是闲置着的,然后排队等候着的小朋友依次上“飞机”。如果有飞机闲置,则小朋友一定会上去玩(小朋友不会在意飞机使用的时间);如果同时有多架“飞机”闲置着,小朋友一定会选择标号最小的那架。
现在你带着你的弟弟来到了游乐园,排到了最后一个位置。你想知道你弟弟会在哪架“飞机”上体验。
输入格式
第一行两个数N和M。
接下来一行M个数,第i个表示si。
输出格式
输出一个数,表示你弟弟会坐上哪架飞机。
样例输入
22 5
1 2 3 4 5
样例输出
4
数据范围与提示
数据规模对于30% 的数据 N≤1 000 000;对于100% 的数据 1≤N≤1 000 000 000,1≤M≤1 000。
数据范围如此之庞大,循环暴力解决是绝对不行的!!!!!!!!就连单层循环都不允许~~~~~为此我哭了一阵!!!
程序代码解析
解析:
(1)如果完成一件事一次需要b分钟,那么如果总共用n分钟,那么共完成了几次,第n分钟正在做第几次(不一定完成)。
技巧:①共完成了n/b次。
②n分钟正在做第(n+b-1)/b次。
②证明:假设n/b=k,n%b=y;
那么,可知如果y==0,那么总共就做了k次,且第k次恰好完成;如果y!=0,那么总共做了k+1次,但是第k+1次正在做,还没有完成。
为了避免余数的讨论,进行这样的处理(n+b-1)/b。
而:(n+b)/b与n/b是等效的,只是商k+1而已。
如果原先n恰好足够b,那么n-1一定不足b,(n-1)%b=y-1。
故在原来的基础上加上一个b-1之后,与原来等价。不足b时结果加1.
(2)二分法的精髓:二分并不一定局限于对有序数列的查找,对于无需数列,可以转换角度建立二分模型,将不能二分的情况转化为二分的模型,如本题中用下标与总时间建立模型进行二分。当然这建立在(1)可求的基础上。
以下代码摘自:http://blog.163.com/sentimental_man/blog/static/730016182011931103428207/
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long I64;
const int MAXN = 1001;
const int INF = 0x7fffffff;
int g_n, g_m, g_time[MAXN], g_min;
//输入并找出最小值
void Input()
{
scanf("%d%d", &g_n,&g_m);
int i;
g_min = INF;
for (i = 0; i < g_m; i++)
{
scanf("%d",&g_time[i]);
if (g_time[i] < g_min) g_min =g_time[i];
}
}
I64 GetNumber(I64 minite) //统计minite分钟内能容纳小朋友的总人数
{
int i;
I64 number = 0;
for (i = 0; i < g_m &&number < g_n; i++)
number += (minite + g_time[i] -1) / g_time[i]; //用的就是技巧(1)
return number;
}
I64 FindTime() //找到n这个人玩飞机的时间
{
I64 l, r, mid, num;
l = 0, r = ((I64) g_min) * g_n; //开始的时候这边忘记类型转化,导致数据溢出,第五组数据一直过不了! 在整数和长整数混用时一定要注意!
while (l < r)
{
mid = (l + r) / 2;
num = GetNumber(mid);
if (num >= g_n)
r = mid;
else
l = mid + 1;
}
return r;
}
int FindId(I64 minite) //寻找所玩飞机的编号
{
int i;
I64 t_n = g_n;
t_n -= GetNumber(minite - 1); //得出最后一分钟内有多少个小朋友正在玩飞机
minite--;
for (i = 0; i < g_m; i++)
{
if (minite % g_time[i] == 0) //如果求余为0,那么一定会有小朋友上飞机
{
t_n--;
if (t_n == 0) return i + 1;
}
}
return -1;
}
int main()
{
Input();
I64 time = FindTime(); //先二分找出n这个人玩飞机的时间
int id = FindId(time); //根据这个时间找出n小朋友玩的飞机
printf("%d\n", id);
// system("pause");
return 0;
}
时间复杂度基本能达到O(log(2,n));
我带着Orz的心情笑了!!!!!!!!!!!~~~
清北学堂第一题 游乐园 SmartOJ 1815(二分查找的精髓)相关推荐
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream> #i ...
- 2017国庆 济南清北学堂 8天乐
Day 0 想吐槽济南的堵车 大约接近4点从莱芜走的,走高速一个多小时,5点左右就到了济南,但是因为济南的堵车,下班高峰期,用了两个多小时才到了我们的目的地.好不容易到宾馆登记了,mc还要我们开会,8 ...
- 2020清北学堂秋季营感想——Hoarfrost
2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...
- 对于清北学堂2018国庆刷题班的学习总结
\(10.1\) 例题1: 最多因子数(Link) 给定一个区间\([L, R]\),要求求出在区间内拥有最大因子数的数. 定义\(F(X)\)为\(X\)的因子个数函数.首先我们要知道,对于任意一个 ...
- 清北学堂 2017-10-07
********今天得了在清北的最高分,有点开心wwwww,mjy爱您! 树 [问题背景] zhx 是二叉查找树大师. [问题描述] 二叉查找树是一种特殊的二叉树(每个节点最多只有两个儿子的树 ...
- 【十一日记】 清北学堂酱油记
Day 0 五点起床 困~ 喜闻乐见的六点集合 嗯我们出发的时候迟到了四分钟( 06:26 第一次出去怎么多人 啧啧啧 @57的熊孩子们好多啊qwq 十分钟到一中 果然老司机233 嗯 目睹他们放学吃 ...
- 清北学堂十一培训酱油记
[day0] 要坐大巴去北京--(没错是大巴!)然而说好的六点走,生生等到了七点--不过一路上还是很happy的!@某导游兔子 然而到华电之后,身子都散架了--这次的酒店在北农,感觉还可以,跟华电里面 ...
- 清北学堂2019.5.3
Day 6(文泓宇[爱撒和zqf狗粮的 little sister]) 今天讲的是有关OI中的STL库: 首先,拒绝两个问题: • 这东西我自己也能写啊? • 这东西怎么写啊? STL: pair(自 ...
- 清北学堂学习笔记 第一期
Day 1 1.贪心的奇怪方法:调整法 调整法,顾名思义,就是用别的方式进行题目的分析以及证明,例如说luogu的最大乘积.这种题目的主要分析思路为:先考虑一些简单的情况,通过简单的情况来推出一些有用 ...
最新文章
- 继中美之后,欧盟会成为下一个 AI 超级体吗?
- INRIX自动驾驶汽车平台扩大使用范围 帮助城市管理交通
- PHP之星际设计模式下(转自lightsaber)
- ubuntu自定义安装里怎么选_超市里的五香粉怎么选?看懂配料表,两个小技巧,不怕选不好。...
- HTML基础知识(未完待续)
- hyper-v ubuntu 图形界面不流畅_ubuntu简单美化教程
- 浅谈es6 promise
- linux下好玩的命令
- python设计选择题代码源_Python程序的设计试题库完整
- 给刚做网站不久的草根站长们
- 微信点餐小程序怎么做(微信点餐小程序制作方法)
- kudu tablet的设计
- 2019年9月中国编程语言排行榜
- 【企业安全实战】开源HIDS OSSEC部署与扩展使用
- Unity3d模型导入都需要注意哪些事项?
- php类的开发语言,php是什么开发语言
- 卡罗拉更换变速油教程
- 不同类型的轴承受力简介
- winform 如何让 comboBox1 不能输入,只能下拉选择
- 【C语言】判断二维空间中的点,是否在圆内(输出:该点在圆内、该点在圆上、该点在圆外)。 允许的误差为1e-6.
热门文章
- 基于java的仓储管理系统设计与实现(含源文件)
- 在台式电脑上完美安装Mac OS X操作系统的解决方案
- 短视频、直播平台——电商直播源码第三方SDK接入教程
- lqc_TCP Wrappers访问控制
- 谈谈在我在外包公司工作的经历,悲催的我,还失去了我心爱的猴子
- 实现一个信息量的计算公式
- python目录是什么意思_python是什么(python是什么意思)
- win32con模块安装
- 一个ABAP中级开发工程师应该学习什么
- 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)