码迷,mamicode.com
首页 > 其他好文 > 详细

【1-5】最大间隙问题

时间:2019-10-02 19:05:27      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:最大值   i++   一个   black   最小值   结果   线性时间   gap   amp   

′问题描述:
最大间隙问题:给定 n 个实数 n
x , x , , x 1 2 ? ,求这 n 个数在实轴上相邻 2 个数之间的最
大差值。假设对任何实数的下取整函数耗时O(1) ,设计解最大间隙问题的线性时间算法。
′编程任务:
对于给定的 n 个实数 n
x , x , , x 1 2 ? ,编程计算它们的最大间隙。
′数据输入:
输入数据由文件名为 input.txt 的文本文件提供。文件的第 1 行有 1 个正整数 n。接下来
的 1 行中有 n 个实数 n
x , x , , x 1 2 ? 。
′结果输出:
程序运行结束时,将找到的最大间隙输出到文件 output.txt 中。
输入文件示例 输出文件示例
input.txt output.txt
5
2.3 3.1 7.5 1.5 6.3
3.2

【题解】


先求出坐标的最大值和最小值的差len=maxx-minx
然后把minx~maxx这整个区间分成n-1份。
这样的话,除了minx和max在第1和第n个区间(maxx特殊处理放在第n个区间,minx会固定放在第一个区间)
然后其余的n-2个数字会分配在1..n-1这n-1个区间中(第n个区间只有最大的那个数字(当然多个最大的数字也无所谓))
显然会有一个区间是空着的!
这就说明最大的gap肯定是至少横跨了一个区间的!所以不用在意每个区间内部的排序顺序,只要记录下来每个区间的最大坐标值和最小坐标值就好了。
然后顺序便利一遍这n-1个桶就行!
beautiful!

【代码】

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

const int N = 200000;
const double INF = 1e8;

int n;
double x[N+10];
double mi = INF,ma = -INF;
double segmax[N+10],segmin[N+10],segcount[N+10];

int main(){
    //freopen("E://gap6.in","r",stdin);
    scanf("%d",&n);
    for (int i = 1;i <= n;i++){
        scanf("%lf",&x[i]);
        mi = min(mi,x[i]);
        ma = max(ma,x[i]);
    }
    //min..max 分成n-1个区间 有n-2个点会落在这n-1个区间里
    for (int i = 1;i <= n;i++){
        int idx = (int)((n-1)*(x[i]-mi)/(ma-mi)) + 1;//mi在第一个区间,ma在第n个区间
        //printf("%d\n",idx);
        if (segcount[idx]==0){
            segmax[idx] = segmin[idx] = x[i];
        }else{
            segmax[idx] = max(segmax[idx],x[i]);
            segmin[idx] = min(segmin[idx],x[i]);
        }
        segcount[idx]++;
    }
    double pre = segmax[1];double maxgap = 0;
    for (int i = 2;i<=n;i++){
        if (segcount[i]){
            if (segmin[i]-pre>maxgap){
                maxgap = segmin[i]-pre;
            }
            pre = segmax[i];
        }
    }
    printf("%.10f\n",maxgap);
    return 0;
}

【1-5】最大间隙问题

标签:最大值   i++   一个   black   最小值   结果   线性时间   gap   amp   

原文地址:https://www.cnblogs.com/AWCXV/p/11617846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!