列表

详情


WY63. 丰收

描述

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

输入描述

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

输出描述

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

示例1

输入:

5
2 7 3 4 9
3
1 25 11

输出:

1
5
3

原站题解

C++ 解法, 执行用时: 30ms, 内存消耗: 3752KB, 提交时间: 2020-10-29

#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include<algorithm>
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
    int n, m;
    std::iostream::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    int app[100000] = { 0 };
    for (int i = 0; i < n; i++)
    {
        cin >> app[i];
         
    }
    cin >> m;
    vector<pair<int, int>> vec(m);
    for (int i = 0; i < m; i++)
    {
        cin >>vec[i].first;
        vec[i].second = i;
    }
    for (int i = 1; i < n; i++)
    {
        app[i] += app[i - 1];
    }
    sort(vec.begin(), vec.end());
    int j = 0;
    vector<int> display(m);
    for (int i = 0; i<m; i++)
    {
        while (vec[i].first>app[j])
            j++;
        display[vec[i].second] = j+1;
    }
    for (int i = 0; i<m; i++)
        printf("%d\n",display[i] );
    //二分查找!
    /*cin >> m;
    for (int i = 0; i != m; ++i) {
        cin >> q;
        cout<< lower_bound(appsum.begin(), appsum.end(), make_pair(q,0))->second<< endl;
    }*/
    return 0;
}

C++ 解法, 执行用时: 31ms, 内存消耗: 3780KB, 提交时间: 2020-10-29

#include <stdio.h>
#include <vector>
#include <string>
#include <cstring>
#include<algorithm>
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
    int n, m;
    std::iostream::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    int app[100000] = { 0 };
    for (int i = 0; i < n; i++)
    {
        cin >> app[i];
         
    }
    cin >> m;
    vector<pair<int, int>> vec(m);
    for (int i = 0; i < m; i++)
    {
        cin >>vec[i].first;
        vec[i].second = i;
    }
    for (int i = 1; i < n; i++)
    {
        app[i] += app[i - 1];
    }
    sort(vec.begin(), vec.end());
    int j = 0;
    vector<int> display(m);
    for (int i = 0; i<m; i++)
    {
        while (vec[i].first>app[j])
            j++;
        display[vec[i].second] = j+1;
    }
    for (int i = 0; i<m; i++)
        printf("%d\n",display[i] );
    //二分查找!
    /*cin >> m;
    for (int i = 0; i != m; ++i) {
        cin >> q;
        cout<< lower_bound(appsum.begin(), appsum.end(), make_pair(q,0))->second<< endl;
    }*/
    return 0;
}

上一题