FZU 1492 地震预测(模拟链表的应用)(Java实现)

怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生。

假设已知一段时间的n次地壳震动能量的采样值为a1,a2,…an,那么第i 次采样的最小波动值为min{|ai-aj| | i<j<=n},即第i 次采样的最小波动值是其后n-i次采样值与第i次采样值之差的绝对值中最小的值,特别地,第n次采样的最小波动值为an。

请编写一个程序计算这n次采样的最小波动值之和。

如果将这个数组排序后,那么波动最小必须要求两个数字相距越近越好,同时还要去掉那些之前的数字,因此可以使用链表保存排序后的数组,删除操作是O(1)的,查询做一下预处理也可以做到O(1)

import java.io.*;
import java.util.*; class node {
int id;
int v;
} class cmp implements Comparator<node> {
@Override
public int compare(node a, node b) {
return a.v > b.v ? 1 : -1;
}
} public class Main {
static final int N = 100005;
static node a[] = new node[N];
static int idx[] = new int[N];
static int pre[] = new int[N];
static int next[] = new int[N];
static final int inf= 0x3f3f3f3f;
public static void main(String[] args) throws IOException {
Scanner cin = new Scanner(new InputStreamReader(System.in));
while (cin.hasNext()) {
int n = cin.nextInt();
for (int i = 1; i <= n; i++) {
if (a[i] == null) a[i] = new node();
a[i].v = cin.nextInt();
a[i].id = i;
}
a[0]=new node();a[n+1]=new node();
a[0].v=a[n+1].v=inf;
long ans = a[n].v;
Arrays.sort(a, 1, 1 + n, new cmp());
for (int i = 1; i <= n; i++) {
idx[a[i].id] = i;
pre[i] = i - 1;
next[i] = i + 1;
}
int min, j, tmp;
for (int i = 1; i < n; i++) {
j = idx[i];
min = Math.abs(a[pre[j]].v - a[j].v);
min = Math.min(Math.abs(a[next[j]].v - a[j].v), min);
next[pre[j]]=next[j];
pre[next[j]]=pre[j];
ans += min;
}
System.out.println(ans);
}
cin.close();
}
}

FZU 1492 地震预测(模拟链表的应用)(Java实现)的更多相关文章

  1. FZU 1492 地震预测(链表)

    实际上把数组排序一遍加入链表中,再记录好数组原来的数在链表中的位置.我们只需要维护链表的删除操作就可以了. # include <cstdio> # include <cstring ...

  2. FZU - 1492(Problem 1492 地震预测)

    怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一段时间的n次地壳震动能量的采样值为a1,a2,-an,那么第i ...

  3. hdu5009 Paint Pearls (DP+模拟链表)

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 M ...

  4. HDU 6215 Brute Force Sorting(模拟链表 思维)

    Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  5. 【教程】模拟登陆百度之Java代码版

    [背景] 之前已经写了教程,分析模拟登陆百度的逻辑: [教程]手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程 然后又去用不同的语言: Python的: [教程]模 ...

  6. UVa12657 - Boxes in a Line(数组模拟链表)

    题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...

  7. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  8. CF 552(div 3) E Two Teams 线段树,模拟链表

    题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...

  9. UVA11988-Broken Keyboard(数组模拟链表)

    Problem UVA11988-Broken Keyboard Accept: 5642  Submit: 34937 Time Limit: 1000 mSec Problem Descripti ...

随机推荐

  1. IntelliJ IDEA 缓存和索引介绍

    转自:https://www.cnblogs.com/zhanghaibinblogs/p/6722061.html IDEA 在首次加载项目的时候都会创建索引,IDEA 的缓存和索引主要是用来加快文 ...

  2. GG_Logs 日志类库封装使用说明

    3.6.GG_Logs 日志类库封装使用说明 GG_Logs类库项目,Nuget安装log4net 添加代码配置代码: [assembly: log4net.Config.XmlConfigurato ...

  3. git clone ssh permissions are too open 解决方案。

    错误如图所示 方案如下 https://stackoverflow.com/questions/9270734/ssh-permissions-are-too-open-error

  4. Html5 编程题

    1.请写出下面所示的控件的html 代码? <div>   <div><a>姓名:</a><input type="text" ...

  5. ACM_01背包(恰好装满)

    背包2 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量刚好为 W ...

  6. 02—IOC实现项目中的解耦

  7. 全面学习ORACLE Scheduler特性(12)使用Windows和Window Groups

    七.使用Windows 此Windows非彼Windows,通常说的Windows是指盖首富的操作系统,而此处所说的Windows,是指SCHEDULER特性中的一个子项.在SCHEDULER中,WI ...

  8. 如何向expect脚本里面传递参数

    如何向expect脚本里面传递参数   比如下面脚本用来做ssh无密码登陆,自动输入确认yes和密码信息,用户名,密码,hostname通过参数来传递   ssh.exp   Python代码   # ...

  9. Elasticsearch--建议器

    目录 可用的建议器类型 term建议器 term建议器的配置选项 phrase建议器 completion建议器 在考虑性能的情况下,允许用户的拼写错误,以及构建一个自动完成功能 可用的建议器类型 t ...

  10. Appium Python API 汇总(中文版)

    网络搜集而来,留着备用,方便自己也方便他人.感谢总结的人! 1.contexts contexts(self): Returns the contexts within the current ses ...