zoukankan      html  css  js  c++  java
  • FZU

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

    假设已知一段时间的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

    题意很好理解不在阐述。。。
    
    思路:
    
    先写一个结构体,结构体中包含下标和值,这里要注意,如果想对结构体中的数据进行排序时,要写一个操作符重载(或者写一个cmp),不然运行不了,比如这份代码中的
    bool operator <(const node &v) const
    {
            return num<v.num;
    }
    
    把每个数的值和坐标都存在结构体数组里面后,sort一下,然后把第i个数的前一个数和后一个数的坐标存在b[maxn][2]中,因为只有与i相邻的数的差才是最小的,把当前的数遍历后就把它擦去,用数组模拟链表。
    比如:
                b[b[i][0]][1]=b[i][1];
                b[b[i][1]][0]=b[i][0];
    
    
    //代码:
    #include<queue>
    #include<stack>
    #include<vector>
    #include<math.h>
    #include<cstdio>
    #include<sstream>
    #include<numeric>//STL数值算法头文件
    #include<stdlib.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<functional>//模板类头文件
    using namespace std;
    
    const int INF=100000000;
    const int maxn=110000;
    typedef long long ll;
    
    int n;
    struct node
    {
        int idx,num;
        bool operator <(const node &v) const
        {
            return num<v.num;
        }
    } a[maxn];
    
    int pos[maxn],b[maxn][2];
    
    inline int min(int A,int B)
    {
        return A>B?B:A;
    }
    
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            int i,j,sum;
            for(i=1; i<=n; i++)
            {
                scanf("%d",&a[i].num);
                a[i].idx=i;
            }
            sort(a+1,a+n+1);
            a[0].idx=0,a[0].num=INF;
            a[n+1].idx=n+1,a[n+1].num=INF;
            pos[0]=0,pos[n+1]=n+1;
            for(i=1; i<=n; i++)
            {
                pos[a[i].idx]=i;
                b[a[i].idx][0]=a[i-1].idx;
                b[a[i].idx][1]=a[i+1].idx;
            }
            sum=a[pos[n]].num;
            for(i=1; i<n; i++)
            {
                int t1=abs(a[pos[i]].num-a[pos[b[i][0]]].num);
                int t2=abs(a[pos[i]].num-a[pos[b[i][1]]].num);
                sum+=min(t1,t2);
                b[b[i][0]][1]=b[i][1];
                b[b[i][1]][0]=b[i][0];
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
    
    
    
    

    //同学代码(数组模拟链表)

  • 相关阅读:
    Python selenium —— 父子、兄弟、相邻节点定位方式详解
    Python爬虫入门教程石家庄链家租房数据抓取
    自动化测试 selenium 环境搭建
    python3爬虫(find_all用法等)
    python网络爬虫抓取动态网页并将数据存入数据库MySQL
    mvc设计模式和mvc框架的区别
    python正则表达式贪婪与非贪婪模式
    python3获取一个网页特定内容
    使用exceljs 前端导出表格并自定义样式和超链接
    如何在devtools中找到未使用 JavaScript 和 CSS 代码
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264837.html
Copyright © 2011-2022 走看看