P1571 眼红的Medusa
解题思路
这道题目需要找出同时获得科技创新奖和特殊贡献奖的人员名单,并按科技创新奖名单中的顺序输出。
方法思路
-
输入处理:首先读取两个奖项的获奖人数和具体名单。
-
排序处理:对特殊贡献奖的名单进行排序,以便后续使用二分查找提高效率。
-
查找共同获奖者:遍历科技创新奖的名单,对于每个获奖者,使用二分查找在特殊贡献奖的名单中查找是否存在。
-
输出结果:如果找到共同获奖者,则按科技创新奖名单中的顺序输出。
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 10; // 定义常量N,作为数组的最大长度 int n,m; // n表示科技创新奖人数,m表示特殊贡献奖人数 int a[N],b[N]; // 数组a存储科技创新奖名单,数组b存储特殊贡献奖名单 // 二分查找函数,判断x是否在数组b中 bool find(int x) { int l = 1,r = m; // 初始化查找范围为整个数组b while(l <= r) { int mid = (l + r) / 2; // 计算中间位置 if(b[mid] == x) return 1; // 找到x,返回true else if(b[mid] < x) l = mid + 1; // 如果中间值小于x,调整左边界 else if(b[mid] > x) r = mid - 1; // 如果中间值大于x,调整右边界 } return 0; // 未找到x,返回false } int main() { cin >> n >> m; // 输入两个奖项的人数 for(int i = 1; i <= n; i++) cin >> a[i]; // 输入科技创新奖名单 for(int i = 1; i <= m; i++) cin >> b[i]; // 输入特殊贡献奖名单 sort(b + 1,b + 1 + m); // 对特殊贡献奖名单进行排序,以便二分查找 for(int i = 1; i <= n; i++) // 遍历科技创新奖名单 { if(find(a[i])) cout << a[i] << " "; // 如果当前人员在特殊贡献奖名单中,输出 } return 0; }
代码解释
-
输入处理:使用两个数组
a和b分别存储两个奖项的名单。 -
排序处理:对数组
b进行排序,这是为了后续的二分查找能够高效进行。 -
二分查找:
find函数实现了二分查找算法,用于快速判断某个编号是否存在于数组b中。 -
遍历与输出:遍历数组
a中的每个元素,使用find函数检查是否存在于数组b中,如果存在则输出。
这种方法利用了二分查找的高效性(时间复杂度为O(log m)),使得整体算法的时间复杂度为O(n log m),适用于大规模数据。

浙公网安备 33010602011771号