7-7 找数
输入n个按升序排列的整数,m次询问,每次询问一个整数X,请输出数组中X第一次出现的下标,如果不存在则输出-1。
题目保证输入的整数在16位int范围内.
输入格式:
第一行输入n和m(1<=n<=1000000,1<=m<=100000)
第二行输入用空格分隔的n个整数
第三行输入用空格分隔的m次询问的X
输出格式:
在一行中输出m个用空格分隔的整数,行末有换行但无多余空格,每个整数表示询问的答案
输入样例:
9 6
1 1 2 2 3 4 5 5 5
1 2 3 4 5 6
输出样例:
0 2 4 5 6 -1
这里要注意的是:首先这个a数组要开大一点,以防段错误
其次要注意的是,看题目要求,是否下标与要输出的位数一致
还有要注意的是他可能会有连续重复的数字,因为要输出第一次出现的下标,我这使用了while循环,如果他的前一位和自己一致,那便下标数减一,同时还要注意下标为0的情况
#include<bits/stdc++.h>
using namespace std;
int a[1000000];
int tree(int l,int r,int t){
int mid;
while(l<=r){
mid=(l+r)/2;
if(a[mid]==t){
while(a[mid]==a[mid-1]&&mid!=0)
mid--;
return mid;
}
else if(t<a[mid])
r=mid-1;
else
l=mid+1;
}
return -1;
}
int main() {
int n,m,t;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>t;
if(i>0)
cout<<" ";
cout<<tree(0,n-1,t);
}
cout<<endl;
return 0;
}
7-8 二分查找
对于输入的n个整数,先进行升序排序,然后进行二分查找。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个各不相同的待排序的整数,第三行是查询次数m(1≤m≤100),第四行输入m个待查找的整数。
输出格式:
对于每组测试,分2行输出,第一行是排序后的升序的结果,每两个数据之间留一个空格;第二行是查找的结果,若找到则输出排序后元素的位置(从1开始,每两个数据之间留一个空格),否则输出0。
输入样例:
9
4 7 2 1 8 5 9 3 6
5
10 9 8 7 -1
输出样例:
1 2 3 4 5 6 7 8 9
0 9 8 7 0
这一题我用到了sort函数先给他排序
还有一点要注意的是:就是上一题的注意项,他是从1开始,而我的数组下标是从0开始,因此,我需要将mid+1;
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int a[1000000];
int tree(int l,int r,int t){
int mid,flag=0;
while(l<=r){
mid=(l+r)/2;
if(a[mid]>t)
r=mid-1;
else if(a[mid]<t)
l=mid+1;
else if(a[mid]==t){
return mid+1;
flag=1;
}
}
if(flag==0)
return 0;
}
int main(){
int n,m,t,cnt=0;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++){
if(cnt==0){
cout<<a[i];
cnt=1;
}
else if(cnt==1)
cout<<" "<<a[i];
}
cout<<endl;
cin>>m;
cnt=0;
for(int i=0;i<m;i++){
cin>>t;
if(i>0)
cout<<" ";
cout<<tree(0,n-1,t);
}
cout<<endl;
}
}