题目描述
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。
输入:
第一行一个数n(1 <= n <= 105)。
第二行n个数ai(1 <= ai <= 1000),表示从左往右数第i堆有多少苹果
第三行一个数m(1 <= m <= 105),表示有m次询问。
第四行m个数qi,表示小易希望知道第qi个苹果属于哪一堆。
输出:
m行,第i行输出第qi个苹果属于哪一堆。
我的思路
输入A的时候直接统计每一堆sum,输入后记录index和question,排序
#include <iostream>
#include<vector>
#include <algorithm>
using namespace std;
bool cmp(const pair<int, int>&a, const pair<int, int>&b)
{
return a.second<b.second;
}
int main()
{
int n;
cin>>n;
vector<int>A(n, 0);
cin>>A[0];
for(int i=1; i<n; i++)
{
int tmp;
cin>>tmp;
A[i]=A[i-1]+tmp;
}
int m;
cin>>m;
vector<pair<int, int>>questions;
for(int i=0; i<m; i++)
{
pair<int, int>tmp;
tmp.first=i;
cin>>tmp.second;
questions.push_back(tmp);
}
sort(questions.begin(), questions.end(), cmp);
vector<int>ans(m,0);
int j=0;
for(int i=0; i<m; i++)
{
while(A[j]<questions[i].second)
{
j++;
}
ans[questions[i].first]=j;
}
for(int i=0; i<m; i++)
{
cout<<ans[i]+1<<endl;
}
return 0;
}
运行时间:423ms
占用内存:3764k
感觉写这些题的时候没有在leetcode上严谨,不判断不存在情况…