• FZU 1492 地震预测(模拟链表的应用)(Java实现)


    FZU 1492 地震预测(模拟链表的应用)(Java实现)

    怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生。
    
    假设已知一段时间的n次地壳震动能量的采样值为a1,a2,…an,那么第i 次采样的最小波动值为min{|ai-aj| | i<j<=n},即第i 次采样的最小波动值是其后n-i次采样值与第i次采样值之差的绝对值中最小的值,特别地,第n次采样的最小波动值为an。
    
    请编写一个程序计算这n次采样的最小波动值之和。
    

    如果将这个数组排序后,那么波动最小必须要求两个数字相距越近越好,同时还要去掉那些之前的数字,因此可以使用链表保存排序后的数组,删除操作是O(1)的,查询做一下预处理也可以做到O(1)

    import java.io.*;
    import java.util.*;
    
    class node {
    	int id;
    	int v;
    }
    
    class cmp implements Comparator<node> {
    	@Override
    	public int compare(node a, node b) {
    		return a.v > b.v ? 1 : -1;
    	}
    }
    
    public class Main {
    	static final int N = 100005;
    	static node a[] = new node[N];
    	static int idx[] = new int[N];
    	static int pre[] = new int[N];
    	static int next[] = new int[N];
        static final int inf= 0x3f3f3f3f;
    	public static void main(String[] args) throws IOException {
    		Scanner cin = new Scanner(new InputStreamReader(System.in));
    		while (cin.hasNext()) {
    			int n = cin.nextInt();
    			for (int i = 1; i <= n; i++) {
    				if (a[i] == null) a[i] = new node();
    				a[i].v = cin.nextInt();
    				a[i].id = i;
    			}
    			a[0]=new node();a[n+1]=new node();
    			a[0].v=a[n+1].v=inf;
    			long ans = a[n].v;
    			Arrays.sort(a, 1, 1 + n, new cmp());
    			for (int i = 1; i <= n; i++) {
    				idx[a[i].id] = i;
    				pre[i] = i - 1;
    				next[i] = i + 1;
    			}
    			int min, j, tmp;
    			for (int i = 1; i < n; i++) {
    				j = idx[i];
    				min = Math.abs(a[pre[j]].v - a[j].v);
    				min = Math.min(Math.abs(a[next[j]].v - a[j].v), min);
                    next[pre[j]]=next[j];
                    pre[next[j]]=pre[j];
    				ans += min;
    			}
    			System.out.println(ans);
    		}
    		cin.close();
    	}
    }
    
    
  • 相关阅读:
    Datatables 行数据删除、行上升、行下降功能演示
    1.2 初识输入输出
    布局管理——绝对定位
    创建一个包括菜单栏,工具栏,状态栏,文本编辑部件的经典GUI应用程序的骨架
    工具栏
    上下文菜单
    选项菜单
    创建子菜单
    设置菜单栏
    添加状态栏(显示状态信息)
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6721509.html
Copyright © 2020-2023  润新知