找数
题目描述:
给定 N个整数和 K个待查找的整数M1,M2,...,MK。如果待查找的整数在给定的 N 个整数中,请输出待查找的整数是数组中第几个元素(从 1 开始计算,第一个元素计 1 而不是 0);如果待查找的整数不在给定的 N个整数中,则输出 0。
输入:
第一行输入两个整数 N(1≤N≤10^6)和 K(1≤M≤10^6),分别表示给定的整数总个数和待查找的数的个数;
第二行从小到大输入N 个整数 Number(1≤Numberi≤10^6,其中1≤i≤N),每两个整数之间用一个空格隔开;
第三行输入K个整数Numberj(1≤Numberj≤10^6,其中 1≤j≤K),每两个整数之间用一个空格隔开。
输出:
输出为一行,包括 K个部分,每个部分为题目描述中待查找的元素索引或 0,K个部分之间用一个空格分隔。输出行尾不含多余空格。
样例输入:
3 1
1 4 6
4
样例输出:
2
思路:
这道题就是一道luo二分题,直接套模板就可以了。
(PS:这道题数据又水又有问题,是自动排好序的,所以排完序后数原本在序列中的位置改变了这样的问题就不见了,如果数据严谨的话,用一个结构体,将数的位置和数的值打包在一起变化即可。一会儿给出的代码,是水代码,恰好钻了题目的漏洞)
代码(恰好过的是水数据,没改(懒)):
#include <bits/stdc++.h>
using namespace std;
int n,k;
int num[1000005];
int my_ef(int k){
int l = 1,r = n;
while(l < r){
int mid = (l + r) / 2;
if(num[mid] < k){
l = mid + 1;
}
else{
r = mid;
}
}
if(num[l] != k){
return 0;
}
return l;
}
int main(){
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++){
scanf("%d",&num[i]);
}
sort (num+1,num+n+1);
int a;
for(int i = 1;i <= k;i++){
scanf("%d",&a);
int ans = my_ef(a);
printf("%d\n",ans);
}
return 0;
}
把数据漏洞用到极致的代码(彩蛋):
#include <bits/stdc++.h>
using namespace std;
int n,k,st[1000005];
int main(){
sacnf("%d%d",&n,&k);
int wb;
for(int i = 1;i <= n;i++){
scanf("%d",&wb);
st[wb] = i;
}
for(int i = 1;i <= k;i++){
int a;
scanf("%d",&a);
printf("%d\n",st[a]);
}
return 0;
}
PC:这么写只是题目出的不严谨👆
本文来自博客园,作者:XDFZ武斌,转载请注明原文链接:https://www.cnblogs.com/XDFZwb1523/p/16211469.html

浙公网安备 33010602011771号