题目:有从左到右的n堆苹果。小s知道每堆苹果的个数,那么请问第x个苹果是从左往右数第几堆中的呢?
要求:
输入
第一行: n(代表有n堆苹果,n>=1)
第二行: a1,a2。。。。an。(ai代表第i堆里有ai个苹果)
第三行: m(询问m次)
第四行: q1,q2。。。。qm。(qi表示第i次询问第qi个苹果在第几堆)
思路:
创建一个vector sum,sum[i]的表示前i堆苹果的总数,将q与sum[i]比较。
一开始是用遍历的方法比较q与sum[i](i从0到n),只能通过30%的测试,计算量太大。
后来使用二分查找法比较q与sum,通过了所有测试。
通过测试的代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
unsigned int n;
unsigned int m;
vector<int> a;
a.push_back(0);
vector<int> q;
int sum = 0;
int tmp;
cin >> n;
getchar();
while (cin >> tmp)
{
sum += tmp;
a.push_back(sum);
if (getchar() == '\n')
break;
}
cin >> m;
getchar();
while (cin >> tmp)
{
q.push_back(tmp);
if (getchar() == '\n')
break;
}
for (unsigned int i = 0; i < m; i++)
{
if (q[i] > a[a.size()-1])
{
cout << " " << endl;
continue;
}
unsigned int low = 0;
unsigned int high = a.size()-1;
unsigned int mid = (low + high) / 2;
while (!(q[i]<a[mid] && q[i]>a[mid - 1]))
{
if (q[i] == a[mid])
{
break;
}
else if(q[i]>a[mid])
{
low = mid + 1;
mid = (low + high) / 2;
}
else if(q[i]<a[mid])
{
high = mid-1;
mid = (low + high) / 2;
}
}
cout << mid << endl;
}
return 0;
}