找数

题目描述:

给定 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:这么写只是题目出的不严谨👆

posted @ 2022-04-30 21:39  XDFZ武斌  阅读(222)  评论(0)    收藏  举报