生活随笔
收集整理的這篇文章主要介紹了
地震预测
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
懷特先生是一名研究地震的科學(xué)家,最近他發(fā)現(xiàn)如果知道某一段時(shí)間內(nèi)的地殼震動(dòng)能量采樣的最小波動(dòng)值之和,可以有效地預(yù)測大地震的發(fā)生。
假設(shè)已知一段時(shí)間的n次地殼震動(dòng)能量的采樣值為a1,a2,…an,那么第i 次采樣的最小波動(dòng)值為min{|ai-aj| | i<j<=n},即第i 次采樣的最小波動(dòng)值是其后n-i次采樣值與第i次采樣值之差的絕對值中最小的值,特別地,第n次采樣的最小波動(dòng)值為an。
請編寫一個(gè)程序計(jì)算這n次采樣的最小波動(dòng)值之和。
Input
本題有多組輸入數(shù)據(jù),你必須處理到EOF為止
輸入數(shù)據(jù)第一行有一個(gè)數(shù)n(1<=n<=105) ,表示采樣的次數(shù)。
第二行有n個(gè)整數(shù),表示n次地殼震動(dòng)能量的采樣值a1,a2,…an (0<=ai<=107 )。
Output
輸出n次采樣的最小波動(dòng)值之和。
Sample Input
4
2 0 3 10
Sample Output
21
map的用法參見http://blog.sina.com.cn/s/blog_49c5866c0100eyh0.html
這題是方法說白了就是從后往前。
比如題目的數(shù)據(jù)2 0 3 10
sum為和
3和10最后兩位直接處理完按照大小形成一個(gè)虛擬3 10 sum=17
0插入到這個(gè)序列中 0 3 10
比較0的前后減去0的絕對值誰比較小,取小的那個(gè)。 取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;
}
總結(jié)
以上是生活随笔為你收集整理的地震预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。