网易2019校招C++研发工程师笔试编程题

题目描述:

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

输入描述:

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

测试样例:

5
2 7 3 4 9
3
1 25 11

输出

1

5

3

思路:

前缀和+二分

第i个位置表示前i堆苹果总数量,利用二分查找输入苹果所在的位置

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <map>
#include <list>
#include <utility>
#include <set>
#include <algorithm>
#include <deque>
#include <vector>
#define IO ios::sync_with_stdio(false);\
        cin.tie(0);\
        cout.tie(0);
using namespace std;
typedef long long ll;
typedef vector<int > vi;
const ll INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int MAX = 100000 + 5;
int a[MAX];
int front_a[MAX];
int main()
{
    int n,m;
    scanf("%d",&n);
    for(int i = 1 ; i <= n; i++)
    {
        scanf("%d", a + i );
        front_a[i] = front_a[i-1] + a[i];
    }
    scanf("%d",&m);
    while(m--) {
        int q;
        scanf("%d",&q);
        int left = 1,right = n;

        while(left < right) {
            int middle = (left+right)/2;
            if(front_a[middle] < q )
            {
                left = middle+1;
            }
            else if(front_a[middle]>q){
                right = middle;
            }else {
                left = middle;
                break;
            }
        }
        printf("%d\n",left);
    }
    return 0;
}
/*
5
2 7 3 4 9
3
1 25 11
*/

猜你喜欢

转载自www.cnblogs.com/GHzz/p/9461409.html