生活随笔
收集整理的這篇文章主要介紹了
地震预测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
懷特先生是一名研究地震的科學家,最近他發現如果知道某一段時間內的地殼震動能量采樣的最小波動值之和,可以有效地預測大地震的發生。
假設已知一段時間的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
map的用法參見http://blog.sina.com.cn/s/blog_49c5866c0100eyh0.html
這題是方法說白了就是從后往前。
比如題目的數據2 0 3 10
sum為和
3和10最后兩位直接處理完按照大小形成一個虛擬3 10 sum=17
0插入到這個序列中 0 3 10
比較0的前后減去0的絕對值誰比較小,取小的那個。 取3 sum=20
然后放入2 形成0 2 3 10 比較前后
2-0>3-2 取1 sum=21
使用map的原因是由于map有序。。。。。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
map<int,int>dd;
int main()
{int a[100100];int n;while(scanf("%d",&n)!=-1){int i;for(i=0;i<n;i++){scanf("%d",&a[i]);}dd[a[n-1]]=n-1;dd[a[n-2]]=n-2;int sum=a[n-1]+abs(a[n-1]-a[n-2]);for(int i=n-3;i>=0;i--){if(!dd.count(a[i])){dd[a[i]]=i;}elsecontinue;map<int,int>::iterator t=dd.find(a[i]);map<int,int>::iterator next=++t;map<int,int>::iterator fron;t--;if(t!=dd.begin()){fron=--t;t++;}else{fron=t;}int minn;if(next==dd.end()){minn=t->first-fron->first;}else if(t==dd.begin()){minn=next->first-t->first;}else{minn=next->first-t->first;if(minn>(t->first-fron->first))minn=t->first-fron->first;//minn=min(next->first-t->first,t->first-fron->first);}sum+=minn;}printf("%d\n",sum);dd.clear();}return 0;
}
總結
以上是生活随笔為你收集整理的地震预测的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。