版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}