FZU 1492 地震预测 【思路题】
2017-04-29 17:52
274 查看
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1492
分析:中文题目,题意很清楚,就是求n次采样的最小波动值之和(第i 次采样的最小波动值是其后n-i次采样值与第i次采样值之差的绝对值中最小的值,特别地,第n次采样的最小波动值为an)。
思想:原序列从小到大排列,求出排序后对应的位置,每次找第i个数在排完序之后对应的位置,取值更新左右端点。a: 2 0 3 10
b: 2 1 3 4
0 2 3 10
第一次:a[1]=2;找到a[b[1]],比较左端和右端找一个最小值更新,删除a[b[1]](这里并不是真正的删除,而是覆盖更新相关点的左右端点),更新左端点的右端点的值和,右端点的左端点的值(这里有点绕,就是删除之后对当前这两个节点有影响,然后更新)。
第二次:a[2]=0;找到a[b[2]]和上次的更新取值一样,就这样一直找,注意最左端和最右断为了方便把它初始化为INF。
Code:
思路还是很明白的,就是感觉在表示的特别绕,用代码实现还有点小困难,需要仔细思考。这是第六场个人赛的一道题,比赛的时候没做出来,赛后补了,花了很长时间理思路。今天又忽然看到了这个题,就写出来纪念一下。
分析:中文题目,题意很清楚,就是求n次采样的最小波动值之和(第i 次采样的最小波动值是其后n-i次采样值与第i次采样值之差的绝对值中最小的值,特别地,第n次采样的最小波动值为an)。
思想:原序列从小到大排列,求出排序后对应的位置,每次找第i个数在排完序之后对应的位置,取值更新左右端点。a: 2 0 3 10
b: 2 1 3 4
0 2 3 10
第一次:a[1]=2;找到a[b[1]],比较左端和右端找一个最小值更新,删除a[b[1]](这里并不是真正的删除,而是覆盖更新相关点的左右端点),更新左端点的右端点的值和,右端点的左端点的值(这里有点绕,就是删除之后对当前这两个节点有影响,然后更新)。
第二次:a[2]=0;找到a[b[2]]和上次的更新取值一样,就这样一直找,注意最左端和最右断为了方便把它初始化为INF。
Code:
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<algorithm> #include<math.h> #include<map> #include<queue> #include<string.h> typedef long long LL; using namespace std; #define INF 0x3f3f3f3f const int maxn=100005; struct node2 { int cur; int lpos,rpos;//左右端点记录的位置,而不是数 } d[maxn]; int a[maxn],b[maxn]; bool cmp(int x,int y) { return a[x]<a[y]; } int main() { int n; while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) { scanf("%d",&a[i]); b[i]=i;//存a[i]的位置 } a[0]=a[n+1]=INF; sort(b+1,b+n+1,cmp);//按a[]从小到大排序之后对应原序列的位置 //如a:2 0 3 10 则排序完之后b为:2 1 3 4(是0 2 3 10对应原序列的位置) for(int i=1; i<=n; i++) { d[b[i]].cur=i; d[i].lpos=i-1; d[i].rpos=i+1; } for(int i=1;i<=n;i++) cout<<d[i].cur<<" "<<d[i].lpos<<" "<<d[i].rpos<<endl; int sum=0; for(int i=1; i<n; i++) { int kk=d[i].cur; sum+=min(abs(a[i]-a[b[d[kk].lpos]]),abs(a[i]-a[b[d[kk].rpos]])); d[d[kk].lpos].rpos=d[kk].rpos; d[d[kk].rpos].lpos=d[kk].lpos; } cout<<sum+a <<endl; } }
思路还是很明白的,就是感觉在表示的特别绕,用代码实现还有点小困难,需要仔细思考。这是第六场个人赛的一道题,比赛的时候没做出来,赛后补了,花了很长时间理思路。今天又忽然看到了这个题,就写出来纪念一下。
相关文章推荐
- FZu Problem 1492 地震预测
- Problem 1492 地震预测
- FZU 1492 地震预测(模拟链表)(技巧题)
- FZU - 1492(Problem 1492 地震预测)
- FZU 1492 地震预测(模拟链表的应用)(Java实现)
- 大数据早报:Google向化学家开放量子计算机 科学家将机器学习技术用于地震预测(10.25)
- 识别地震云,预测大地震[7P]
- 地震预测
- 又双叒叕地震了,如何用大数据精准预测地震?
- FZU 2203 单纵大法好 (思路)
- 地震专家不是吃干饭的--地震预报和预测
- 李四光预测的地震带及合肥地震分析
- 预测地震,AI或许可以完成这一不可能的挑战
- 关于地震预测的一个胡思乱想
- FZU 1492 地震预测(模拟链表)(技巧题)
- 李四光预测的地震带及合肥地震分析
- 阿里音乐流行趋势预测大赛一起做-(3)思路
- [思路题+贪心] fzu oj 2197 最小花费
- 失落的地震预测(转自搜狐财经)
- 地震是能预测的,又人广播里说没有地震的...不想说了,地动仪,电子原理图一张