节目
题目难度:中阶
时间限制:2000ms
内存限制:512mb
题目描述
小T作为班级的班长,承担着班级的各项事务,今天班主任交给了小T一个重要的任务,学校的运动会就要开始了,要小T帮忙协助开幕式,开幕式正在进行,有位同学列阵站在操场上,每位同学都有一个属于自己的数字,现在老师会突然喊一个数字,被叫到的同学就需要举起手中的花,但是也有可能喊到的数字和所有同学的都不相同,现在小T想知道被叫到的同学编号,由于这个数字太大了,小T才小学一年级,还算不过来,需要你帮帮他。
输入格式
第一行一个整数表示同学的数量。
第二行一个整数表示老师的询问次数。
第三行用空格隔开的个整数
表示同学们的数字。
第四行用空格隔开的个整数
表示老师喊的数字。
输出格式
Q行,每行一个数表示答案,如果有被叫的同学,就输出对应同学的编号,这里的编号为1−,如果有多个同学被叫到,则输出编号最小的,如果没有同学被叫到,则输出-1。
样例数据
样例输入#1
5
3
5 8 4 9 4
4 5 2
样例输出#1
3
1
-1
数据范围
对于30%的数据,1≤,
≤100。
对于50%的数据,1≤,
≤1000。
对于100%的数据,1≤,
≤100000,1≤
,
≤
。
题解
这题很明显是个二分题,很简单,但有几个坑点:
- 给出的数组是无序的,要sort
- 还要输出编号且是最小的,要用结构体
代码如下
#include<bits/stdc++.h>
using namespace std;
int n,x,q;
struct abcdefghikl
{
int num;
int id;
}a[1000005];
int abcd1(){
int L= 1 ,R= n ,mid,ans=0;
while(L<=R)
{
mid= (L+R)/2 ;
if(a[mid].num==x){
R=mid-1;
ans=mid;
}
else if(a[mid].num>x){
R=mid-1;
}else{
L=mid+1;
}
}
if(ans!=0)
return a[ans].id;
else return -1;
}
bool cmp(abcdefghikl a,abcdefghikl b){
if(a.num==b.num)
return a.id<b.id;
else
return a.num<b.num;
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i].num;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=q;i++){
cin>>x;
cout<<abcd1()<<"\n";
}
return 0;
}