zoukankan      html  css  js  c++  java
  • 【1-5】最大间隙问题

    ´问题描述:
    最大间隙问题:给定 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
    ",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
    ",maxgap);
        return 0;
    }
    
    
  • 相关阅读:
    How to use epoll? A complete example in C
    分享:libzip 0.11 发布,C 语言的 zip 压缩开发包
    linux AIO (异步IO) 那点事儿
    通过引用计数解决野指针的问题(C&C++)
    [原]浅谈几种服务器端模型——反应堆模式(epoll 简介) _Boz 博客园
    基于EPOLL写的HTTP服务器(加入了线程池)_没落都城_新浪博客
    jQuery检测浏览器名称和版本信息
    Jquery.ajax中dataType不可少
    jquery 手风琴效果
    ie下ajax错误:由于出现错误 c00ce56e 而导致此项操作无法完成
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11617846.html
Copyright © 2011-2022 走看看