贺老师上课代码
  1. 二分查找
贺老师上课代码
  • 基础测试
  • 深度优先搜索
    • 11月2日星期天 9:00-12:00
    • 11月9日星期天 9:00-12:00
    • 11月16日星期天 9:00-12:00
    • 11月23日星期天9:00-12:00
  • 并查集
    • 11月1日星期六9:00-12:00
    • 11月1日星期六18:30-21:00
    • 11月8日星期六9:00-12:00
    • 11月8日星期六18:30-21:00
    • 11月15日星期六9:00-12:00
    • 11月15日星期六18:30-21:30
    • 11月22日星期六9:00-12:00
    • 11月22日星期六18:30-21:30
  • 图论基础
    • 11月29日星期六9:00-12:00
    • 12月6日星期六9:00-12:00
  • 广度优先搜索
    • 11月30日星期天9:00-12:00
    • 12月7日星期天9:00-12:00
    • 12月14日星期天9:00-12:00
  • 最短路问题
    • 12月13日星期六9:00-12:00
    • 12月20日星期六9:00-12:00
    • 12月27日星期六9:00-12:00
    • 1月3日星期六9:00-12:00
    • 1月10日星期六9:00-12:00
    • 1月3日星期六9:00-12:00
  • 二分查找
    • 12月28日星期天9:00-12:00
    • 1月11日星期天9:00-12:00
  1. 二分查找

12月28日星期天9:00-12:00

二分查找左边界和右边界

S12L04 同时出现的数

描述

Medusa同学拿到了2组数字,老师请你编程帮他找出,第2组数中的哪些数,在第1组数中出现了,从小到大输出所有满足条件的数。

比如:

第1组数有:8 7 9 8 2 6 3

第2组数有:9 6 8 3 3 2 10

那么应该输出:2 3 3 6 8 9

输入描述

第一行两个整数n和m,分别代表2组数的数量

第二行n个正整数

第三行m个正整数

对于60%的数据1≤n,m≤1000,每个数<=2*10^9

对于100%的数据1≤n,m≤100000,每个数<=2*10^9

输出描述

按照要求输出满足条件的数,数与数之间用空格隔开

用例输入 1

7 7
8 7 9 8 2 6 3
9 6 8 3 3 2 10

用例输出 1

2 3 3 6 8 9

代码

/**
while循环条件写错
变量名不要写错
输入写错 静态存储区
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000100],b[1000100];
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(a+1,a+1+n);
	sort(b+1,b+1+m);
	/*
	1定义左指针l=1 右指针r=n  mid
	2.while l<=r  mid赋值  结束条件 l>r 
	3.判断指针左移还是右移 开始二分查找 
	*/
	for(int i=1;i<=m;i++){
		int x = b[i];
		int l=1,r=n,mid;
		while(l<=r){
			mid = l+r>>1;
			if(x>a[mid]){
				l=mid+1;
			}else if(x<a[mid]){
				r=mid-1;
			}else if(x==a[mid]){
				cout<<x<<" ";
				break;
			}
		}
	}
	return 0;
}

S12L05 最满意的方案

描述

高考结束了,同学们要开始了紧张的填写志愿的过程,大家希望找一个自己最满意的大学填报方案,请你编程帮忙实现。 现有 m(m≤100000) 所学校,每所学校预计分数线是 ai(ai≤10^6) 。有 n(n≤100000) 位学生,估分分别为 bi(i≤10^6)。根据 n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。

输入描述

第一行读入两个整数 m,n,m 表示学校数, n 表示学生数。
第二行共有 m 个数,表示 m 个学校的预计录取分数。
第三行有 n 个数,表示 n 个学生的估分成绩。

输出描述

一行,为最小的不满意度之和。(数据保证计算结果≤10^9)

用例输入 1

4 3
513 598 567 689
500 600 550

用例输出 1

32

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,num[1000100],x,jishu;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>num[i];
	}
	sort(num+1,num+n+1);
	for(int i=1;i<=m;i++){
		cin>>x;
		if(x>=num[n]){
			jishu+=x-num[n];
		}else if(x<=num[1]){
			jishu+=num[1]-x;
		}else{
			int l=1,r=n,mid;
			while(l<=r){
				mid=l+(r-l)/2;
				if(x>num[mid]){
					l=mid+1;
				}else if(x<num[mid]){
					r=mid-1;
				}else if(x==num[mid]){
					r=mid-1;
				}
			}
			int a = num[l]-x;
			int b = x-num[r];
			if(a>b){
				jishu+=b;
			}else{
				jishu+=a;
			}
		}
	}
	cout<<jishu;
	return 0;
}

T1240 查找最接近的元素

描述

在一个非降序列中,查找与给定值最接近的元素。

输入描述

第一行包含一个整数n,为非降序列长度。1 ≤ n ≤ 100000。

第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。

第三行包含一个整数m,为要询问的给定值个数。1 ≤ m ≤ 10000。

接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。

输出描述

m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

用例输入 1

3
2 5 8
2
10
5

用例输出 1

8
5

代码

#include <bits/stdc++.h>
using namespace std;
long long n, m,x;
int a[1000100];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    cin>>m;
    // sort(a+1,a+1+n);
    for(int i=1;i<=m;i++) {
        cin>>x;
        if(x>=a[n]){
            cout<<a[n]<<endl;
        }else if(x<=a[1]) {
            cout<<a[1]<<endl;
        }else {
            int *p = upper_bound(a+1,a+1+n,x);
            int q = a[p-a]-x;
            int w = x-a[p-a-1];
            // cout<<"q="<<q<<" w="<<w<<endl;
            if (q>=w) {
                cout<<a[p-a-1]<<endl;
            }else {
                cout<<a[p-a]<<endl;
            }
        }
    }
    return 0;
}

作业:S12Z03 小X算排名

修改于 2026-01-02 01:08:35
上一页
1月3日星期六9:00-12:00
下一页
1月11日星期天9:00-12:00
Built with