• 数差


    描述

    在今天的数学课上,同学们昏昏欲睡,老师非常生气,于是在黑板上写了N个整数ai.然后提出一个问题,让同学们从中选C个数,使得这c个数任意两个数差的绝对值最小尽可能大,请你求出这个值来。

    输入

    第一行是N和C。 接下来的1行N整数ai。

    输出

    一个整数,表示两两最小差距的最大值。

    样例输入[复制]
    5 3 
    1 2 8 4 9
    样例输出[复制]
    3
    提示

    【提示】

    选择1、4和8

    【数据规模】

    2<=N<=100000 0<=ai<=1000 000 000

    这题求最大值,没有动态规划的性质,又不可以直接贪心,那么我们就考虑二分就可以了

    二分我的统一模板如下

    1 while(l<=r){
    2     int mid=l+r>>1;
    3     if(check(mid))ans=mid,l=mid+1;
    4     else r=mid-1;
    5 }

    事先排好序,由于每次check要找尽量凑齐c个数,所以用stl的lower_bound函数二分查找当前数的位置,找到了继续+mid再二分找最小位置,可以证明这是最优

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 int n,c,a[10000005];
     6 int check(int x){
     7     int num=1,temp=a[1];
     8     while(num<c){
     9         temp+=x;
    10         int pos=lower_bound(a+1,a+n+1,temp)-a;
    11         if(a[pos]<temp)pos++;
    12         if(pos>n)return 0;
    13         temp=a[pos];
    14         num++;
    15     }
    16     return 1;
    17 }
    18 int main(){
    19     cin>>n>>c;
    20     for(int i=1;i<=n;i++)cin>>a[i];
    21     sort(a+1,a+n+1);
    22     int l=1,r=1000000000;int ans;
    23     while(l<=r){
    24         int mid=l+r>>1;
    25         if(check(mid))ans=mid,l=mid+1;
    26         else r=mid-1;
    27     }
    28     cout<<ans;
    29     return 0;
    30 }
  • 相关阅读:
    服务器中一个进程kill不掉,如何处理?
    JVM基本概念
    Redis安装以及常见问题
    JVM---类加载器
    lambda表达式
    maven学习(3)pom.xml文件说明以及常用指令
    maven学习(2)仓库和配置
    maven学习(1)下载和安装和初步使用(手动构建项目和自动构建项目)
    JMicro微服务之超时&重试
    JMicro微服务Hello World
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9536103.html
Copyright © 2020-2023  润新知