本人原创日志,允许转载,但请注明出处,谢谢!

题目描述

游乐园里新推出一个游戏——飞机驾驶体验。有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(二分查找的精髓)相关推荐

  1. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream> #i ...

  2. 2017国庆 济南清北学堂 8天乐

    Day 0 想吐槽济南的堵车 大约接近4点从莱芜走的,走高速一个多小时,5点左右就到了济南,但是因为济南的堵车,下班高峰期,用了两个多小时才到了我们的目的地.好不容易到宾馆登记了,mc还要我们开会,8 ...

  3. 2020清北学堂秋季营感想——Hoarfrost

    2020清北学堂秋季营感想 前言:九月三十日放假以后,就马不停蹄地开始了这一次的奥赛培训.原先参加过暑假的提高组腾飞营,当时第一场模拟赛拿了第一,便觉得CSP的题目难度不会很高,普及+/提高-左右的难 ...

  4. 对于清北学堂2018国庆刷题班的学习总结

    \(10.1\) 例题1: 最多因子数(Link) 给定一个区间\([L, R]\),要求求出在区间内拥有最大因子数的数. 定义\(F(X)\)为\(X\)的因子个数函数.首先我们要知道,对于任意一个 ...

  5. 清北学堂 2017-10-07

    ********今天得了在清北的最高分,有点开心wwwww,mjy爱您! 树  [问题背景]  zhx 是二叉查找树大师.  [问题描述]  二叉查找树是一种特殊的二叉树(每个节点最多只有两个儿子的树 ...

  6. 【十一日记】 清北学堂酱油记

    Day 0 五点起床 困~ 喜闻乐见的六点集合 嗯我们出发的时候迟到了四分钟( 06:26 第一次出去怎么多人 啧啧啧 @57的熊孩子们好多啊qwq 十分钟到一中 果然老司机233 嗯 目睹他们放学吃 ...

  7. 清北学堂十一培训酱油记

    [day0] 要坐大巴去北京--(没错是大巴!)然而说好的六点走,生生等到了七点--不过一路上还是很happy的!@某导游兔子 然而到华电之后,身子都散架了--这次的酒店在北农,感觉还可以,跟华电里面 ...

  8. 清北学堂2019.5.3

    Day 6(文泓宇[爱撒和zqf狗粮的 little sister]) 今天讲的是有关OI中的STL库: 首先,拒绝两个问题: • 这东西我自己也能写啊? • 这东西怎么写啊? STL: pair(自 ...

  9. 清北学堂学习笔记 第一期

    Day 1 1.贪心的奇怪方法:调整法 调整法,顾名思义,就是用别的方式进行题目的分析以及证明,例如说luogu的最大乘积.这种题目的主要分析思路为:先考虑一些简单的情况,通过简单的情况来推出一些有用 ...

最新文章

  1. 继中美之后,欧盟会成为下一个 AI 超级体吗?
  2. INRIX自动驾驶汽车平台扩大使用范围 帮助城市管理交通
  3. PHP之星际设计模式下(转自lightsaber)
  4. ubuntu自定义安装里怎么选_超市里的五香粉怎么选?看懂配料表,两个小技巧,不怕选不好。...
  5. HTML基础知识(未完待续)
  6. hyper-v ubuntu 图形界面不流畅_ubuntu简单美化教程
  7. 浅谈es6 promise
  8. linux下好玩的命令
  9. python设计选择题代码源_Python程序的设计试题库完整
  10. 给刚做网站不久的草根站长们
  11. 微信点餐小程序怎么做(微信点餐小程序制作方法)
  12. kudu tablet的设计
  13. 2019年9月中国编程语言排行榜
  14. 【企业安全实战】开源HIDS OSSEC部署与扩展使用
  15. Unity3d模型导入都需要注意哪些事项?
  16. php类的开发语言,php是什么开发语言
  17. 卡罗拉更换变速油教程
  18. 不同类型的轴承受力简介
  19. winform 如何让 comboBox1 不能输入,只能下拉选择
  20. 【C语言】判断二维空间中的点,是否在圆内(输出:该点在圆内、该点在圆上、该点在圆外)。 允许的误差为1e-6.

热门文章

  1. 基于java的仓储管理系统设计与实现(含源文件)
  2. 在台式电脑上完美安装Mac OS X操作系统的解决方案
  3. 短视频、直播平台——电商直播源码第三方SDK接入教程
  4. lqc_TCP Wrappers访问控制
  5. 谈谈在我在外包公司工作的经历,悲催的我,还失去了我心爱的猴子
  6. 实现一个信息量的计算公式
  7. python目录是什么意思_python是什么(python是什么意思)
  8. win32con模块安装
  9. 一个ABAP中级开发工程师应该学习什么
  10. 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)