二分算法练习

目录

一、在排序数组中查找元素的第一个和最后一个位置

二、牛可乐和魔法封印

三、A-B数对

四、烦恼的高考志愿


一、在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

答案如下:

cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int n = nums.size();
        if(n == 0)
        {
            return {-1,-1};
        }
        auto it1 = lower_bound(nums.begin(),nums.end(),target);
        auto it2 = upper_bound(nums.begin(),nums.end(),target);
        if(it1 == nums.end() || *it1 != target)
        {
            return {-1,-1};
        }
        int left = it1 - nums.begin();
        int right = it2 - nums.begin() - 1;
        return {left,right};
    }
};

二、牛可乐和魔法封印

牛可乐和魔法封印

答案如下:

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 1e5 + 10;
int a[N];
int n;

int binary_search(int x, int y)
{
    int left = 1, right = n;
    while(left < right)
    {
        int mid = left + (right - left)/2;
        if(a[mid] >= x)
        {
            right = mid;
        }
        else{
            left = mid + 1;
        }
    }
    if(a[left] < x) return 0;
    int tmp = left;
    left = 1; right = n;
    while(left < right)
    {
        int mid = left + (right - left + 1)/2;
        if(a[mid] > y)
        {
            right = mid - 1;
        }
        else{
            left = mid;
        }
    }
    if(a[left] > y) return 0;
    return right - tmp + 1;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    int q; cin >> q;
    while(q--)
    {
        int x,y; cin >> x >> y;
        cout << binary_search(x,y) << endl;;
    }
    return 0;
}

三、A-B数对

P1102 A-B 数对 - 洛谷

答案如下:

cpp 复制代码
#include<iostream>
#include<unordered_map>
using namespace std;

const int N = 2e5 + 10;
typedef long long LL;
unordered_map<int, int> mp;
int a[N];

int main()
{
	int n,c; cin >> n >> c;
	for(int i = 0; i < n; i++)
	{
		cin>>a[i];
		mp[a[i]]++;
	}
	LL ret = 0;
	for(int i = 0; i < n; i++)
	{
		ret += mp[c + a[i]];
	}
	cout << ret << endl;
	return 0;
}

四、烦恼的高考志愿

P1678 烦恼的高考志愿 - 洛谷

答案如下:

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long LL;

const int N = 1e5 + 10;
int a[N];
int m,n;

int find(int x)
{
	int left = 1, right = m;
	while(left < right)
	{
		int mid = (left + right)/2;
		if(a[mid] >= x)
		{
			right = mid;
		}
		else{
			left = mid + 1;
		}
	}
	return left;
}

int main()
{
	cin >> m >> n;
	for(int i = 1; i <= m; ++i)
	{
		cin >> a[i];
	}
	sort(a+1,a+1+m);
	a[0] = -1e8;
	LL ret = 0;
	for(int i = 1; i <= n; ++i)
	{
		int b; cin >> b;
		int pos = find(b);
		ret += min(abs(a[pos] - b), abs(a[pos-1] - b));
	}
	cout << ret << endl;
	return 0;
 } 
相关推荐
爱吃香菜的初学者4 分钟前
八.数据结构——哈希表(1)
数据结构·散列表
ZhengEnCi6 分钟前
2026年10月30日AI早报:Gemini 4 Carbon登顶、DeepSeek融资1055亿、智元机器人上岗实测
人工智能·算法
强哥聊算力19 分钟前
《算力江湖·Intel帝国往事》第三集:安迪·格鲁夫的铁血时代:Intel为什么能把对手逼到墙角?
运维·人工智能·科技·算法·ai·gpu算力
Shaoshing37 分钟前
LeetCode100 11. 盛最多水的容器
算法·leetcode
raindayinrain1 小时前
c++新特性--实用新特性
c++
Soneswy1 小时前
C++基础篇——类与对象(中)
开发语言·c++
骑着蜗牛撵大象3271 小时前
558 万美元训出 671B 模型:DeepSeek-V3 算法与系统的协同拆解
分布式·算法·moe·deepseek-v3·mla·fp8训练
Eyfcom1 小时前
〖阶段性回顾〗物流系统架构与算法的 Day 1-5 知识图谱与实战答疑
算法·系统架构·知识图谱·物流管理系统·快递管理系统
xunberg1 小时前
【Agent 生产化手记-02】Agent 怎么向人提问
人工智能·算法·架构
海绵宝宝转agent1 小时前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先