P1571 眼红的Medusa

解题思路

这道题目需要找出同时获得科技创新奖和特殊贡献奖的人员名单,并按科技创新奖名单中的顺序输出。

方法思路

  1. 输入处理:首先读取两个奖项的获奖人数和具体名单。

  2. 排序处理:对特殊贡献奖的名单进行排序,以便后续使用二分查找提高效率。

  3. 查找共同获奖者:遍历科技创新奖的名单,对于每个获奖者,使用二分查找在特殊贡献奖的名单中查找是否存在。

  4. 输出结果:如果找到共同获奖者,则按科技创新奖名单中的顺序输出。

#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;
}

代码解释

  • 输入处理:使用两个数组ab分别存储两个奖项的名单。

  • 排序处理:对数组b进行排序,这是为了后续的二分查找能够高效进行。

  • 二分查找find函数实现了二分查找算法,用于快速判断某个编号是否存在于数组b中。

  • 遍历与输出:遍历数组a中的每个元素,使用find函数检查是否存在于数组b中,如果存在则输出。

这种方法利用了二分查找的高效性(时间复杂度为O(log m)),使得整体算法的时间复杂度为O(n log m),适用于大规模数据。

posted @ 2025-05-01 15:15  CRt0729  阅读(30)  评论(0)    收藏  举报