首页 > 其他分享 >洛谷题单指南-二分查找与二分答案-P1678 烦恼的高考志愿

洛谷题单指南-二分查找与二分答案-P1678 烦恼的高考志愿

时间:2024-02-29 18:24:31浏览次数:24  
标签:二分 分数 录取分数 P1678 int 洛谷题 mid 学生

原题链接:https://www.luogu.com.cn/problem/P1678

题意解读:要计算不满意度之和的最小值,就要保证每个人的不满意度最小,即选择的学校录取分数-学生分数之差的绝对值最小。

解题思路:

如何在学校录取分数中找与学生分数最接近的呢?有三种可能:

1、学生分数在录取分数中存在相等的

2、学生分数在录取分数中不存在,找刚好比学生分数大的录取分数

3、学生分数在录取分数中不存在,找刚好比学生分数小的录取分数

正好可以对应二分的两种模版,

模版1:要么找到相等值,要么找到刚好大于学生分数的值

模版2:要么找到相等值,要么找到刚好小于学生分数的值

用两个二分计算之后,取录取分数-学生分数的绝对值较小的。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int M = 100005, N = 100005;

int a[M], b[N], m, n;
long long ans;

int bs1(int x)
{
    int l = 1, r = m, res = -1;
    while(l <= r)
    {
        int mid = (l + r) >> 1;
        if(a[mid] >= x) res = mid, r = mid - 1;
        else l = mid + 1;
    }
    return res;
}

int bs2(int x)
{
    int l = 1, r = m, res = -1;
    while(l <= r)
    {
        int mid = (l + r) >> 1;
        if(a[mid] <= x) res = mid, l = mid + 1;
        else r = mid - 1;
    }

    return res;
}

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 idx1 = bs1(b[i]);
        int idx2 = bs2(b[i]);
        int v = INT_MAX;
        if(idx1 != -1) v = min(v, abs(a[idx1] - b[i]));
        if(idx2 != -1) v = min(v, abs(a[idx2] - b[i]));
        ans += v;
    }
    cout << ans;

    return  0;
}

 

标签:二分,分数,录取分数,P1678,int,洛谷题,mid,学生
From: https://www.cnblogs.com/jcwy/p/18045048

相关文章

  • 洛谷题单指南-二分查找与二分答案-P1102 A-B 数对
    原题链接:https://www.luogu.com.cn/problem/P1102题意解读:寻找A-B=C的数对数量,C大于0,B一定比A小,枚举B,找A是否存在即可。解题思路:先将数据由小到大排序,接下来介绍两种方法:二分、双指针1、二分枚举第1~n-1个数,作为B,寻找A=B+C的数量,只需要通过二分查找第一A和最后一个A的位置l、......
  • CF514D R2D2 and Droid Army(二分,ST表)
    传送门解题思路直接二分能干掉的人数,然后check函数枚举所有区间,因为m很小,所以可以用m个ST表预处理每个区间对应每个属性的最大值。一是需要注意二分的写法,而是注意check(0)时候的特判。AC代码#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#......
  • 洛谷题单指南-二分查找与二分答案-P2249 【深基13.例1】查找
    原题链接:https://www.luogu.com.cn/problem/P2249题意解读:找有序数组中某个数第一次出现的位置,二分模版题,由于是二分板块的第一题,有必要对二分的各种模版进行介绍。解题思路:关于二分的一切:1、二分的本质二分的本质,是通过某种判定把目标范围划分成两个区间二分问题通常有两......
  • 二分查找——修补木桶
    修补木桶-HihoCoder1362-VirtualJudge(vjudge.net)#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>usingnamespacestd;#defineintlonglong#defineQAQ0constintN=2e5+5,inf=0x3f3f3f3f,mod=1e7+7;int......
  • 洛谷题单指南-贪心-P1080 [NOIP2012 提高组] 国王游戏
    原题链接:https://www.luogu.com.cn/problem/P1080题意解读:通过不同的排队方式,让获得最多奖赏的大臣金额尽可能的少。此题如果没有思路,用全排列枚举可以“骗”分,更好的做法直觉上是某种贪心策略,另外基于数据规模考虑,要拿满分,需要上高精度。下面就由浅入深一步一步的解决。解题思......
  • 【算法】关于最长递增子序列(LIS)二分+贪心解法
    前言我们都知道,解决LIS的常规解法为DP,时间复杂度为O(n^2),但是在一些条件苛刻的问题中,通常DP的解法会超时。那么,是否存在一种时间复杂度更优秀的解法呢?答案是肯定的,有一种二分加贪心的解法可以将时间复杂度降低为O(nlogn)。详解如果我们现在要求下面这一组数据的LIS:我们需......
  • LeetCode二分查找 swift 面试
     funcbinarySearch(_array:[Int],_target:Int)->Int?{varleft=0varright=array.count-1whileleft<=right{letmid=(left+right)/2ifarray[mid]==target{returnmid......
  • 洛谷题单指南-贪心-P4447 [AHOI2018初中组] 分组
    原题链接:https://www.luogu.com.cn/problem/P4447题意解读:将一个有序的数列,按不重复连续数分成一组,可分成若干组,使得人数最少的组在各种分组方式之中是最大的。解题思路:观察样例说明,有6个测试点的ai​互不相同,因此直接将数据排序,然后连续数分成一组,计算每组数量最少的,即为答案,6......
  • 704. 二分查找C
    现在开始刷代码随想录里的题了。intsearch(int*nums,intnumsSize,inttarget){inthead=0,tail=numsSize-1;while(head<=tail){intmid=(head+tail)/2;if(nums[mid]<target){head=mid+1;}elseif(nums[mid]>target){......
  • #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
    题目支持区间加和区间查询第\(k\)小分析分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是\(O(\sqrt{n})\)的查询的话,如果只有散块直接归并出结果,否则二分答案,加上小块合并成的整块,相当于是整体二分,就是\(O(\sqrt{n}\log{a_......