zoukankan      html  css  js  c++  java
  • 算法设计与分析 2.4 白给题

    ★题目描述

    给定N个自然数,你需要选择M个,使得M个数中两两之间的差的绝对值的最小值尽可能大,求这个最大值。

    ★输入格式

    第一行两个空格隔开的正整数N,M,表示自然数个数和要选的数的个数。
    接下来一行为N个空格隔开的给定自然数。

    ★输出格式

    一个整数。

    ★样例输入

    3 2
    1 2 3
    

    ★样例输出

    2
    

    ★参考代码

    思路参考自共享文件

    /*
    先对数列进行排序
     
    设置一个变量 间隔res 
    设置这个 间隔res 从(max-min)/m开始减小到为1
    一旦根据这个间隔可以在差值序列中找到对应的数列,那么就说明这个间隔为答案 
    
    [0,max_res]间找间隔res应该使用二分 
    否则会超时
    */
    
    #include<bits/stdc++.h>
    using namespace std;
    
    int n,m;
    int a[200005];
    int b[200005];
    
    int fun(int res){
    	int cnt=0, k=1;
    	for(int i=1; i<n; ++i){
    		if(res+a[cnt]<=a[i]){
    			cnt=i;
    			k++;
    		}
    		if(k>=m) return 1;
    	}
    	return 0;
    }
    
    int df(int L, int R){
    	if(L>R) return 0;
    	
    	int mid = (L+R)/2;
    	if(fun(mid)) 
    		return max(df(mid+1, R), mid);
    	else
    		return df(L, mid-1);
    }
    
    int main(){
    	scanf("%d%d",&n, &m);
    	for(int i=0; i<n; ++i){
    		scanf("%d", &a[i]);
    	} 
    	
    	sort(a, a+n);
     	
    	printf("%d
    ",df(0, (a[n-1]-a[0])/(m-1) )); 
    	
    	return 0;
    }
    
  • 相关阅读:
    按回车键提交表单
    Access数据库类型及属性
    Problem 1002
    问题 1003
    Problem 1003
    Switch Game(摘自LP学C++)
    1006
    膜拜蛇形矩阵
    A == B?
    Rectangles
  • 原文地址:https://www.cnblogs.com/yejifeng/p/12044438.html
Copyright © 2011-2022 走看看