网易2019-水果堆数查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zh1204190329/article/details/81591278

题干暂时 忘了,先贴代码

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;


int main()
{
    // 列数
    int n = 0;

    cin >> n;
    vector<int> a(n);
    for (int i = 0;  i < n; i++)
    {
         cin >> a[i];
    }


    // 输入次数
    int m = 0;
    cin >> m;
    vector<int> q(m);

    for (int i = 0; i < m; i++)
    {
        cin >> q[i];
  //      cout << q[i];
    }

    int a_tmp[n] = {0};
    vector<int> num;
    for (int i = 0; i < n; i++)
    {
        if ( i == 0)
        {
            a_tmp[0] = a[0];
        }
        else
        {
            a_tmp[i] += a_tmp[i-1] + a[i];
        }
        num.push_back(a_tmp[i]);
    }

    int length = num.size();

    for (int i = 0; i < length; i++)
        cout << num[i] << " ";
    cout << endl;

    int left = 0;
    int right = length - 1;
    int mid = (left + right) / 2;

    for (int i = 0 ; i < m; i++)
    {
        if ( q[i] <= num[0])
        {
            cout << "1"  << endl;
        }
        else if (a[i] == num[length - 1])
        {
            cout << length  << endl;
        }


        for (int j = 0;  j < length - 1; j++)
        {

            if (q[i] > num[j] && q[i] < num[j+1])
                        cout << j + 2 << endl;
        }
    }

    return 0;
}



上面使用的冒泡复杂度太高,导致只能通过20%。改为二分查找。

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;


int MidSort(const vector<int> &a , int key)
{
    int left = 0;
    int right = a.size() - 1;

    while (left <= right)
    {
        int mid = (left + right) / 2;
        if (a[mid] > key)
        {
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }

    }
    return left;
}



int main()
{
    // 输入每堆水果的数量
    int n = 0;
    cin >> n;
    vector<int> a(n);
    for (int i = 0;  i < n; i++)
    {
         cin >> a[i];
    }


    // 输入查找次数
    int m = 0;
    cin >> m;
    vector<int> q(m);

    for (int i = 0; i < m; i++)
    {
        cin >> q[i];
    }

	// 求取每堆水果边界值:和
    int a_tmp[n] = {0};
    vector<int> num;
    for (int i = 0; i < n; i++)
    {
        if ( i == 0)
        {
            a_tmp[0] = a[0];
        }
        else
        {
            a_tmp[i] += a_tmp[i-1] + a[i];
        }
        num.push_back(a_tmp[i]);
    }

	// 二分查找
    for (int i = 0 ; i < m; i++)
    {
        int pos = MidSort(num, q[i]);
        cout << pos + 1 << endl;
    }

    return 0;
}



猜你喜欢

转载自blog.csdn.net/zh1204190329/article/details/81591278