题目描述
又到了丰收的季节,恰逢小易去牛牛的果园里游玩。
牛牛常说他对整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。
在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。
牛牛觉得这个问题太简单,所以希望你来替他回答。
输入描述:
第一行一个数n(1 <= n <= 105)。
第二行n个数ai(1 <= ai <= 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
先将要输入的多组询问排序,之后从头开始遍历苹果堆,如果连数值较小的询问当前都无法满足,那么大的询问自然无法满足
之后再将询问恢复之前的次序输出即可
#include<stdio.h>
#include<iostream>
#include <algorithm>
using namespace std;
typedef struct Test1
{
int Num; //记录各次询问的值
int No; //记录各询问一开始的序号,方便最后恢复次序
int flag; //记录属于第几堆
}Test;
bool cmp1(Test x,Test y)
{
return x.Num<y.Num;
}
bool cmp2(Test x,Test y)
{
return x.No<y.No;
}
int main()
{
int n,m,i,sum=0,j;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
Test b[m];
for(i=0;i<m;i++)
{
scanf("%d",&b[i].Num);
b[i].No=i;
}
sort(b,b+m,cmp1);
j=0;
sum=a[0];
for(i=0;i<m;)
{
if(b[i].Num<=sum)
{
b[i].flag=j;
i++;
}
else
{
j=j+1;
sum+=a[j];
}
}
sort(b,b+m,cmp2);
for(i=0;i<m;i++)
{
printf("%d\n",b[i].flag+1);
}
}