首页 > 编程语言 >CSP/信奥赛C++刷题训练:经典二分例题(2):洛谷P1678:烦恼的高考志愿

CSP/信奥赛C++刷题训练:经典二分例题(2):洛谷P1678:烦恼的高考志愿

时间:2024-10-27 12:19:14浏览次数:8  
标签:tmp 二分 洛谷 P1678 int mid 估分 分数线 例题

CSP/信奥赛C++刷题训练:经典二分例题(2)

烦恼的高考志愿

在这里插入图片描述

题目背景

计算机竞赛小组的神牛 V 神终于结束了高考,然而作为班长的他还不能闲下来,班主任老 t 给了他一个艰巨的任务:帮同学找出最合理的大学填报方案。可是 v 神太忙了,身后还有一群小姑娘等着和他约会,于是他想到了同为计算机竞赛小组的你,请你帮他完成这个艰巨的任务。

题目描述

现有 m m m 所学校,每所学校预计分数线是 a i a_i ai​。有 n n n 位学生,估分分别为 b i b_i bi​。

根据 n n n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。

输入格式

第一行读入两个整数 m , n m,n m,n。 m m m 表示学校数, n n n 表示学生数。

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

输出格式

输出一行,为最小的不满度之和。

样例 #1

样例输入 #1

4 3
513 598 567 689
500 600 550

样例输出 #1

32

提示

数据范围:

对于 30 % 30\% 30% 的数据, 1 ≤ n , m ≤ 1000 1\leq n,m\leq1000 1≤n,m≤1000,估分和录取线 ≤ 10000 \leq10000 ≤10000;

对于 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 100000 1\leq n,m\leq100000 1≤n,m≤100000,估分和录取线 ≤ 1000000 \leq 1000000 ≤1000000 且均为非负整数。

用二分求解

满分代码

#include<bits/stdc++.h>
using namespace std;
//二分:升学排序后,二分查找边界:数组中第一个>=x的元素的位置 
const int N=1e5+10;
int n,m,a[N],b[N]; //a为学校的分数线,b为学生的估分
//二分函数,找a数组中第一个>=x的元素的位置 
int f(int x){
	int l=1,r=m,mid;
	while(l<=r){
		mid=(l+r)/2;
		if(a[mid]>=x) r=mid-1;
		else l=mid+1;
	}
	if(l<=m) return l; //找到了 
	else return -1;//没找到 
}
long long ans=0; 
int main(){
	cin>>m>>n;
	for(int i=1;i<=m;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	sort(a+1,a+m+1);
	for(int i=1;i<=n;i++){
		int tmp=f(b[i]);//tmp为找到的a数组中第一个>=b[i]的元素的下标
		if(tmp==-1) ans+=b[i]-a[m]; //没找到的情况:b[i]比任何学校的分数线都高 
		else if(tmp==1) ans+=a[1]-b[i];//任何学校的分数线都比b[i]高 
		else ans+=min(abs(a[tmp]-b[i]),abs(a[tmp-1]-b[i]));
		//对比tmp和tmp前面那个分数线,哪个差值最小 
	} 
	cout<<ans;
	return 0;
}

文末彩蛋:

点击王老师青少年编程主页有更多精彩内容

标签:tmp,二分,洛谷,P1678,int,mid,估分,分数线,例题
From: https://blog.csdn.net/weixin_66461496/article/details/143243786

相关文章

  • 洛谷 P5738 【深基7.例4】歌唱比赛 C语言 题解
    题目描述n(n≤100)n(n≤100) 名同学参加歌唱比赛,并接受 m(m≤20)m(m≤20) 名评委的评分,评分范围是 00 到 1010 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m−2m−2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 22 位小数......
  • 20241024每日一题洛谷P1012
    普及-洛谷P1012拼数设有n个正整数,a1a2a3......an将它们联接成一排,相邻数字首尾相接,组成一个最大的整数输入:第一行有一个整数,表示数字个数n第二行有n个整数,表示给出的n个整数ai输出:一个正整数,表示最大的整数可以考虑两种路线:使用sort函数编辑cmp参数进行字符串......
  • C语言-详细讲解-洛谷P1255 数楼梯
    目录1.题目要求2.题目解读 1.如何计算走法数?2.如何解决大数加法,防止数据溢出1.进位的处理2.正序运算,倒序输出3.寻找结果中最高的非零位3.代码实现1.题目要求2.题目解读 一道非常经典的题目,简洁易懂,但需要一定的数学思维,难点如下:1.如何计算走法数?这里需要我......
  • 洛谷 P6628 [省选联考 2020 B 卷] 丁香之路 做题记录
    图论好题啊!首先我们枚举终点\(u\),看到一定要走完指定的\(m\)条边,很像一条欧拉路问题啊!但是现在问题是一个欧拉路问题,有两个点的度数是奇数,并不好做。我们不妨先从起点\(s\)向\(u\)连一条边,变成欧拉回路问题。现在我们需要做的是将度数为奇数的点加边使其变为偶数。方法是......
  • 洛谷 P1002 [NOIP2002 普及组] 过河卒
    你好,我是gwg725。洛谷账号:大号小号欢迎与我讨论。:)题目描述:棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过......
  • 洛谷 P2680 [NOIP2015 提高组] 运输计划 做题记录
    首先题目要求最大的最小,我们二分答案,对于每个答案,我们筛出比它长的路径,找到它们最长的公共边,删掉后验证正确性即可。找公共边可以用树上差分来做,时间复杂度\(O(m\logn\logV)\),其中\(V\)是二分区间大小。你会发现你挂了一堆点,让我们来卡常:首先预处理出所有节点的\(dfn\),每......
  • [笔记](例题更新中)Z函数(扩展KMP)
    对于长度为\(n\)的字符串\(S\),定义\(z[i]\)表示\(S\)本身和\(S[i,n]\)这个后缀的最长公共前缀(LCP)的长度,(特别地,\(z[1]\)可以记为\(0\)或\(n\))则\(z\)被称为\(S\)的Z函数。扩展KMP算法可以在\(O(n)\)的时间复杂度内求得\(S\)的Z函数数组。约定:字符串下标从\(\bf{1}\)开始,下标......
  • 洛谷 P3128 [USACO15DEC] Max Flow P 做题记录
    因为一次添加会对点和边都造成影响,而点一次能加两个,于是最大值一定在点上。由于只有一次询问,考虑树上差分。设一次询问给出的两点为\(x,y\),那么我们在\(x\)和\(y\)处分别加\(1\),在\(\operatorname{lca}(x,y)\)处减\(1\),因为该点本身也有增加,于是我们在它的父节点再减去......
  • 洛谷 P2572 [SCOI2010] 序列操作 做题记录
    其实和小白逛公园差不多,编写代码的难度远大于思路难度,难点是调试:注意在区间异或\(1\)的时候分清代码里的最长连续\(1\)的长度和\(1\)的个数。注意查询最长\(1\)的时候要用结构体上传,如果用到了定值len的话要赋值。注意如果只用一个tag的话,遇到区间异或要对原先......
  • 例题2.39
    例题2.39代码importpandasaspd读取CSV文件,指定列范围从第二列到第四列(Python索引从0开始,但usecols的索引从1开始)try:a=pd.read_csv("data2_38_2.csv",usecols=range(1,5))print("CSV文件读取成功。")exceptFileNotFoundError:print("CSV文件未找到,请检查文件路径。......