zoukankan      html  css  js  c++  java
  • 烦恼的高考志愿【二分】

    题目大意:

    给出a,b两个数列,求b数列的每一项与a数列任意一项的差的绝对值之和的最小值。


    思路:

    枚举是不可能枚举的,这辈子都不可能枚举的
    枚举会T成某动物,正解二分。
    先将分数线排序,再每读入一个预估分数就二分求解,当r1l时退出,答案是min(abs(scorea[l]),abs(scorea[r]))


    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int n,m,sum,l,r,mid,x,y,a[100011],score;
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
         scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        for (int i=1;i<=m;i++)
        {
            scanf("%d",&score);
            l=1;
            r=n;        
            while (l<r-1)
            {
                mid=(l+r)/2;
                x=min(abs(score-a[l]),abs(score-a[r]));  //求找到的最小值
                y=abs(score-a[mid]); 
                if (x>=y)  //可以更改
                {
                    if (score>=a[mid]) l=mid;
                    if (score<a[mid]) r=mid;
                }
                else   //不可以
                {
                    if (score>=a[mid]) l=mid+1;
                    if (score<a[mid]) r=mid-1;
                }
            }
            sum+=(min(abs(score-a[l]),abs(score-a[r])));
        }
        printf("%d\n",sum);
        return 0;
    }
  • 相关阅读:
    Tips for Hoops 3D & ACIS
    把书读薄TICPP(2)
    Software Toolbox EasyOPC简介
    Wonderware InSQL and Incurity安装心得
    Linux root password reset
    SQL Server 2005 的搞笑
    SVG 简介
    M0n0wall 是什么?
    Solaris 上调试系统 hang 的总结
    DDNS简介
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998773.html
Copyright © 2011-2022 走看看