您的位置:首页 > 文旅 > 美景 > 手机设计_庆阳官网贴吧_昆明网络推广公司排名_深圳搜索竞价账户托管

手机设计_庆阳官网贴吧_昆明网络推广公司排名_深圳搜索竞价账户托管

2025/1/2 20:48:29 来源:https://blog.csdn.net/2401_88601421/article/details/144331785  浏览:    关键词:手机设计_庆阳官网贴吧_昆明网络推广公司排名_深圳搜索竞价账户托管
手机设计_庆阳官网贴吧_昆明网络推广公司排名_深圳搜索竞价账户托管

相信你是最棒哒!!!

目录

题目描述

题目代码

总结


题目描述

输入 𝑛 个不超过 109的单调不减的(就是后面的数字不小于前面的数字)非负整数 𝑎1,𝑎2,…,𝑎𝑛​,然后进行 𝑚 次询问。对于每次询问,给出一个整数 𝑞,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。

输入格式

第一行 2 个整数 𝑛 和 𝑚,表示数字个数和询问次数。

第二行 𝑛 个整数,表示这些待查询的数字。

第三行 𝑚 个整数,表示询问这些数字的编号,从 1 开始编号。

输出格式

输出一行,𝑚 个整数,以空格隔开,表示答案。

输入 

11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6

输出 

1 2 -1 

说明/提示

数据保证,1≤𝑛≤106,0≤𝑎𝑖,𝑞≤109,1≤𝑚≤105

本题输入输出量较大,请使用较快的 IO 方式。


题目代码

注释版

#include<stdio.h> int a[1000005]; // 定义一个整型数组a,大小为1000005,用于存储数据
int m, n; // 定义两个整型变量m和n,分别用于存储查询次数和数组a中元素的数量// 二分查找函数,用于在数组a中查找元素x
int find(int x) {int l = 1, r = n; // 初始化左右指针,l为左边界,r为右边界,这里数组是从1开始的,所以l初始化为1while (l < r) { // 当左边界小于右边界时,进行循环int mid = l + (r - l) / 2; // 计算中间位置的索引if (a[mid] >= x) // 如果中间位置的元素大于等于xr = mid; // 则将右边界更新为mid,因为x可能在mid的左边else l = mid + 1; // 否则,将左边界更新为mid + 1,因为x可能在mid的右边}if (a[l] == x) // 如果左边界位置的元素等于xreturn l; // 返回该位置的索引else return -1; // 如果没有找到,返回-1
}int main() // 主函数
{int q; // 定义一个整型变量q,用于存储每次查询的值scanf("%d%d", &n, &m); // 读取数组a中元素的数量n和查询次数mfor (int i = 1; i <= n; i++) // 循环读取数组a中的每个元素scanf("%d", &a[i]); // 将输入的值存储到数组a的对应位置for (int i = 1; i <= m; i++) { // 循环进行m次查询scanf("%d", &q); // 读取每次查询的值int ans = find(q); // 调用find函数查找q在数组a中的位置printf("%d ", ans); // 输出查询结果}return 0; 
}

简洁版

#include<stdio.h>
int a[1000005];
int m, n;
int find(int x) {int l = 1, r = n;while (l < r) {int mid = l + (r - l) / 2;if (a[mid] >= x)r = mid;else l = mid + 1;}if (a[l] == x)return l;else return -1;
}
int main()
{int q;scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);for (int i = 1; i <= m; i++) {scanf("%d", &q);int ans = find(q);printf("%d ", ans);}return 0;
}

总结

这段代码的逻辑是:首先读取数列的大小和查询次数,然后读取数列中的每个元素并存储在数组中。接着,对于每次查询,使用二分查找算法在数组中查找对应的值,并输出查找结果。如果找到了值,则输出其在数组中的索引;如果没有找到,则输出-1。洛谷P2249

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com