题目描述
DL 算缘分算得很烦闷,所以常常到体育馆去打保龄球解闷。因为他保龄球已经打了几十年了,所以技术上不成问题,于是他就想玩点新花招。
DL 的视力真的很不错,竟然能够数清楚在他前方十米左右每个位置的瓶子的数量。他突然发现这是一个炫耀自己好视力的借口——他看清远方瓶子的个数后从某个位置发球,这样就能打倒一定数量的瓶子。
-
◯◯◯
-
◯◯◯ ◯
-
◯
-
◯ ◯
如上图,每个 “\bigcirc◯” 代表一个瓶子。如果 DL 想要打倒 33 个瓶子就在 11 位置发球,想要打倒 44 个瓶子就在 22 位置发球。
现在他想要打倒 mm 个瓶子。他告诉你每个位置的瓶子数,请你给他一个发球位置。
输入格式
第一行包含一个正整数 nn,表示位置数。
第二行包含 nn 个正整数 a_iai ,表示第 ii 个位置的瓶子数,保证各个位置的瓶子数不同。
第三行包含一个正整数 QQ,表示 DL 发球的次数。
第四行至文件末尾,每行包含一个正整数 mm,表示 DL 需要打倒 mm 个瓶子。
输出格式
共 QQ 行。每行包含一个整数,第 ii 行的整数表示 DL 第 ii 次的发球位置。若无解,则输出 00。
输入输出样例
输入 #1
5 1 2 4 3 5 2 4 7
输出 #1
3 0
说明
【数据范围】
对于%50 的数据,1<=n,Q<=1000,1<=a[i]m<=10的5次方。
对于%100 的数据,1<=n,Q<=100000,1<=a[i]m<=10的9次方
解释:这题其实就是二分查找,我先用结构体绑定数组(一个记个数,一个记位置),再用sort来快排(二分要求有序),最后用一个二分就可以了。
代码如下:
#include <bits/stdc++.h>
using namespace std;
struct aa{
int g,w;
}gs[100000+5];
bool cmp(aa x,aa y)
{
return x.g<y.g;
}
int n,m,wt,r,l,mid;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&gs[i].g);
for(int i=1;i<=n;i++)
gs[i].w=i;
sort(gs+1,gs+1+n,cmp);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&wt);
r=n+1;l=0;
while(l+1<r)
{
mid=(r+l)/2;
if(gs[mid].g<wt) l=mid;
else r=mid;
}
if(gs[r].g!=wt)cout<<"0"<<endl;
else printf("%d\n",gs[r].w);
}
return 0;
}
效果:
输入:
5 1 2 4 3 5 2 4 7
输出:
3 0