A - 地震预测 FZU - 1492

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

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

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

Input

本题有多组输入数据,你必须处理到EOF为止

输入数据第一行有一个数n(1<=n<=105) ,表示采样的次数。

第二行有n个整数,表示n次地壳震动能量的采样值a1,a2,…an (0<=ai<=107 )。

Output

输出n次采样的最小波动值之和。

Sample Input

4

2 0 3 10

Sample Output

21

有点难想到,用模拟链表的方法才能过,STL的set都超时,做法是,将数据排好序之后模拟成链表,再按开始顺序遍历,找到绝对值最小的再删除。

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 #define maxn 100000+10
 7 const int INF=1000000000;
 8 struct Node
 9 {
10     int x,p;
11     bool operator <(const Node&b)const
12     {return x<b.x;}
13 }num[maxn];
14 int n;
15 int c[maxn];
16 int li[maxn];
17 int pre[maxn];
18 int nex[maxn];
19
20
21 int calc(int x)
22 {
23     int res = INF;
24     if(pre[x]>=1)
25         res = min (res,li[x]-li[pre[x]]);
26     if(nex[x]<=n)
27         res = min (res,li[nex[x]]-li[x]);
28     return res;
29 }
30
31 int main()
32 {
33     while(~scanf("%d",&n))
34     {
35         for(int i=1;i<=n;i++)
36         {
37             scanf("%d",&num[i].x);
38             num[i].p=i;
39         }
40         sort(num+1,num+n+1);
41         for(int i=1;i<=n;i++)
42         {
43             li[i]=num[i].x;
44             c[num[i].p]=i;
45             pre[i]=i-1;
46             nex[i]=i+1;
47         }
48         int ans=0;
49         for(int i=1;i<n;i++)
50         {
51             ans+=calc(c[i]);
52             pre[nex[c[i]]]=pre[c[i]];//更新链表
53             nex[pre[c[i]]]=nex[c[i]];//
54         }
55         ans +=li[c[n]];
56         printf("%d\n",ans);
57     }
58     return 0;
59 }

View Code

转载于:https://www.cnblogs.com/haoabcd2010/p/6728787.html

地震预测(模拟链表)相关推荐

  1. FZU 1492 地震预测(模拟链表)(技巧题)

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

  2. 链表 + 数组模拟链表

    链表的指针实现 1.指针 #include<iostream> using namespace std; int main(){int a = 5;int *p; // int 型的指针d ...

  3. UVa - 11988 Broken Keyboard(数组模拟链表)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18693 #include <iostream> #in ...

  4. 天梯赛模拟 链表去重 (25 分)

    题目: 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另一个链表上.例如给定 L 为 2 ...

  5. 数组模拟链表原理解释

    ** 数组模拟链表原理解释(我觉得比我聪明的人应该都能看懂) ** 最近在学这个,上网搜相关内容多是代码还解释的不清楚,看着头痛,终于我顿悟了,我把我的理解写出来给大家分享一下(本人计较笨,可能写的过 ...

  6. 修正《啊哈算法》上模拟链表算法的错误

    算法描述:   在<啊哈算法>上有介绍模拟链表的实现.链表这种数据结构可以通过数组来实现,我们需要两个数组,其中一个数组data存放数据,即数据域.另外一个数组right用来存放每一个数的 ...

  7. 【NOIP 模拟赛】钟 模拟+链表

    biubiu~~ 这道题实际上就是优化模拟,就是找到最先死的让他死掉,运用时间上的加速,题解上说,要用堆优化,也就是这个意思. 对于链表,单项链表和循环链表都不常用,最常用的是双向链表,删除和插入比较 ...

  8. C++实现数组模拟链表(实现链表的增删功能)

    代码如下: #include <iostream> using namespace std; const int N = 100;struct Node {int data;int nex ...

  9. OJ考试特别版,数组模拟链表(比正儿八经用链表简单,结果还对,何乐而不为)

    1 数据结构实验之链表一:顺序建立链表 (20 分) #include<stdio.h> int main() {int n,i;scanf("%d",&n); ...

最新文章

  1. 离开页面前显示确认提示对话框(兼容IE,firefox) = how to Catch Win...
  2. python中判断变量的类型
  3. 海量特征按照缺失值null/NAN数量异同进行分组归类
  4. 一个textView中的文字设置成两种颜色
  5. Azure实践之如何批量为资源组虚拟机创建alert
  6. 【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)
  7. onvif备忘录(1)--onvif简介及开发框架搭建
  8. 设计模式之单例模式8种实现方式,其六:双重检查
  9. .net framework开发winform_.NET架构开发应知应会
  10. openssl--生成RSA公钥和私钥
  11. Java中的设计模式【我终于懂设计模式了】
  12. 各类顶尖经典电影500部,先收着,待有空的时候慢慢看吧!
  13. WINTC编译汇编的方法
  14. 不用函数,教你快速查找两张表格中的重复内容。
  15. [小o地图-数据] - 城市交通态势数据(实时路况)
  16. Linux编程signal函数使用
  17. mysql 金额_Mysql中金额使用DECIMAL类型
  18. python卡尔曼滤波_[转]python起步之卡尔曼滤波
  19. keil 5 : Error: L6218E: Undefined symbol 问题解决方法小记
  20. 某银行 科技岗位 数据工程师 面试题总结

热门文章

  1. js设计模式——代理模式proxy
  2. HTML5--语义化标签
  3. 一个IT从业者的课外读物___经济管理篇
  4. Win10 蓝牙连接2个天猫精灵X5双音频输出
  5. 贷款平台微信后台流程策划
  6. 实验室制冰机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. UE4,UE5虚幻引擎,Command Console控制台命令,参数集
  8. 自定义重复注解 @Repeatable 使用方式
  9. atoi函数_C语言进阶之路:strtod()函数的用法!
  10. markdown转义_Markdown语法示例