• 2019网易笔试题C++--丰收


    题目描述

    又到了丰收的季节,恰好小易去牛牛的果园里游玩。 牛牛常说他多整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。 在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。 牛牛觉得问题太简单了,所以希望你来替他回答。

    输入描述:

    第一行一个数n(1<=n<=10^5) 第二行n个数ai(1<=ai<=1000),表示从左往右数第i堆有多少苹果 第三行一个数m(1<=m<=10^5),表示有m次询问 第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。

    输出描述:

    m行,第i行输出第qi个苹果属于哪一堆。

    输入例子1:

    5
    2 7 3 4 9
    3
    1 25 11
    

    输出例子1:

    1
    5
    3


    该题的解题思路:求累加和,在累加和中查找,如果采用暴力查找只能通过30%的测试用例,时间复杂度太高,查找的时候可以使用二分查找!
    代码:
     1 //2018年8月11日15:55:16-丰收-采用二分查找就可以了-但是要注意边界条件
     2 
     3 #include <iostream>
     4 using namespace std;
     5 
     6 int main() {
     7     int n;
     8     cin >> n;
     9     int a[n];
    10     for (int i = 0; i < n; ++i) {
    11         cin >> a[i];
    12     }
    13     int m;
    14     cin >> m;
    15     int q[m];
    16     for (int i = 0; i < m; ++i) {
    17         cin >> q[i];
    18     }
    19 
    20     int sum[n];
    21     int res[m];
    22     sum[0] = a[0];
    23     for (int i = 1; i < n; ++i) {
    24         sum[i] = sum[i - 1] + a[i];
    25     }
    26     for (int i = 0; i < m; ++i) {
    27         int j = 0, k = n - 1;
    28         while (j < k) {
    29             int mid = (j + k) / 2;
    30             if (q[i] > sum[mid]) {
    31                 j = mid + 1;
    32             } else{
    33                 k = mid;
    34             }
    35         }
    36         res[i] = k + 1;
    37     }
    38 
    39     //输出
    40     for(int i = 0; i < m; ++i) {
    41         cout << res[i] << endl;
    42     }
    43     return 0;
    44 }
     
  • 相关阅读:
    MySQL next-key lock 加锁范围是什么?
    使用 Docker 安装并连接 MySQL
    Mac 常用软件推荐 —— Java 开发工程师
    Toolkit 大更新:UI 更美观,用起来更方便!
    工作中的设计模式 —— 建造者模式
    工作中的设计模式 —— 策略模式
    工作中的设计模式 —— 原型模式
    Centos7 安装Oracle记录
    Centos7 常用命令和自己平时使用命令
    AutoHotKey 简易自动化脚本的一些资料
  • 原文地址:https://www.cnblogs.com/gousheng/p/9461953.html
Copyright © 2020-2023  润新知