【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\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;
}

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

时间: 2024-10-20 20:13:14

【1-5】最大间隙问题的相关文章

页面元素与页面间的间隙

当我们做一个页面时,默认页面元素距页面左右上下都有一个很小的间隙.如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>三角形</title> </head> <style> .three{ width: 100px; height: 100px; border-style:

无序列表li横向排列的间隙问题

今天在写页面的时候,无意中遇到这样一个问题,就是无序列表li横向排列即做成导航栏时,列表项间有间隙. 如: 将列表项li变成列表块后(即将li标签设置为,display:inline-block后),会变成这样,中间会有间隙. 即便是将外边距.内边距都设为0后,还是有间隙.在调试了很久,还是没法解决这个问题,最后我改变了一下li的位置,结果可以了.我是这样做的. 改变li的位置后,结果如下: 好,问题成功解决了.不知园友们还有没有其他的好办法,欢迎指教.

inline-block各浏览器兼容以及水平间隙问题解决方案

inline-block属性 This value causes an element to generate a block box, which itself is flowed as a single inline box, similar to a replaced element. The inside of an inline-block is formatted as a block box, and the element itself is formatted as a rep

mysql repeatable-read 一次利用间隙锁解决幻读案例

repeatable-read是Mysql默认事务隔离级别!能解决脏读以及不可重复读的问题,但可能出现幻读的情况 不可重复读:在一个未提交的事务里,二次查询结果可能不相同,因为在这个事务执行过程中,外面的   事务可能对这个数据集进行了修改并提交! 幻读:一个事务在操作过程中!有别的事务对此数据集进行了修改并提交,但这些操作第一个事务读不到,等到这个事务提交的时候,便有可能引起明明插入的数据没有查询到,但却出现插入重复的错误! 不可重复读与幻读的区别: 不可重复读是能读到其它事务已经提交的数据,

解决img标签上下出现间隙的方法

图片与父元素下边缘有 2px 的间隙,并不是因为空格.多个 inline-block 元素之间的间隙才是因为空格. 任何不是块级元素的可见元素都是内联元素,其表现的特性是"行布局"形式.----<CSS权威指南> 如图片文字等内联元素,它默认对齐方式都是和它的父级的 baseline 去进行对齐的,但是你对齐的是 baseline,撑开高度的却是元素整体的高度(bottom line),这样肯定就会造成一定的间隙 1.第一种解决方案既然是 inline 元素才会发生这个问题

浮动问题(IE6最小高度问题、双边距问题以及清理图片间隙)

注意事项:在IE6,7 元素浮动要并在同一行的元素 都要加浮动. IE6下上边距BUG IE6下,块元素有浮动和横向的margin,横向的margin值会被放大成两倍 IE6,7下li下几个PX的间隙问题 在IE6,7下li本身没浮动,但是内容浮动了li下就会多出几个px 解决方法: 1.给li加浮动. 2.给li加vertical-align:top(垂直对齐方式)还有middle,bottom对齐元素都要加上.可用于清理图片下方的空隙. span标签本身不支持宽高 问题:在IE6下高度小于1

line-height行高与图片的隐匿文本间隙消除方法

1.块级元素中插入一个内联img元素后,产生多余间隙 代码 消除图片底部间隙几种方法 1.图片与底线对齐 2.图片元素块状化-无基线对齐 3.行高足够小,基线上移 4.消除隐匿文本字体大小 源码 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 &l

图片与边框有间隙的解决办法

在figure或a中插入图片后,图片与边框产生间隙. 一.产生的原因:当初设立标准的不是亚洲而是欧洲,inline元素为了正确显示英文字母如y j g等带有尾巴的,就在底下留空.二.解决办法: 办法1.在figure或者a中设置:font-size:0: 办法2.在图片img中设置:vertical-align:middle:

display:inline-block引发的间隙问题解决办法

在网页布局中我们经常会用到display:inline-block;好处是:能够将块状元素按照内联元素的方式布局,同时能设置宽高.个人感觉很好用,可是用多了慢慢的问题就来了? 1.display:inline-block;在IE6/7中不兼容 解决办法:display:inline-block;*dsiplay:inline;*zoom:1; 2.display:inline-block;会产生莫名的间隙(4px) 原因:换行或空格会占据一定的位置,从而产生间隙, 解决办法: 1.在html代码

多个Img标签之间的间隙处理方法

1.多个img标签写在一行 <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> <img src="/i/eg_tulip.jpg" alt="郁金香" h