CCF-CSP 地铁修建 JAVA 201703-4


做了很多其他题,学习了一番,再回头看这道题,找出了很多可以优化的地方:

1. 对象Main d 可以去掉  pre[]和Find()可以用static静态调用,效果会更快。(快了5分)

2.可以新定义一个Edge类,使用结构化的方法来存储数据。List<Edge> list 来代替原来的ms数组,因为list中存储的是结构化的数据Edge的对象成员,调用起来会比原来二维数组ms要快。 (快了15分)

更新完是90分:代码如下:

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;


class Edge implements Comparable<Edge>{
	int s,e,length;
	Edge(int a,int b,int c){
		s = a;
		e = b;
		length = c;
	}
	public int compareTo(Edge o) {
		return this.length - o.length;
	}
}

public class Main{
	static List<Edge> list = new ArrayList<Edge>();
	
	static int[] pre;
	public static int Find(int x){	
		int fx = x;
		while(pre[fx] != fx){
			fx = pre[fx];
		}
		int i = x,j;
		while(pre[i]!=fx){
			j = pre[i];
			pre[i] = fx;
			i = j;
		}
		return fx;
	}
	
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
//		int[][] ms = new int[m][3];
		int a,b,c;
		for (int i = 0; i < m; i++) {
//			for (int j = 0; j < 3; j++) {
//				ms[i][j] = sc.nextInt();
//				
//			}
			a = sc.nextInt();
			b = sc.nextInt();
			c = sc.nextInt();
			list.add(new Edge(a,b,c));
		}
//		Main d = new Main();
		pre = new int[n+1];
		for (int i = 0; i <pre.length; i++) {
			pre[i] = i;
		}
		
		
//		Arrays.sort(ms, new Comparator<int[]>(){
//            public int compare(int[] o1, int[] o2) {
//            	return o1[2]-o2[2];
//            }
//        } );
		Collections.sort(list);
		
		
		int ans = 0;
		for (int i = 0; i < list.size(); i++) {
//			for (int i = 0; i < m; i++) {
//			int x = d.Find(ms[i][0]);
//			int y = d.Find(ms[i][1]);
			int x = Find(list.get(i).s);
			int y = Find(list.get(i).e);
			int length = list.get(i).length;
			if(x<y)
				pre[y]=x;
			else 
				pre[x]=y;
			if(ans<length) ans = length;
			
			if(Find(n)==1) break;
		}
		System.out.println(ans);
	}
}




以前的case如下:————————————————————————————————

代码:

import java.util.Comparator;
import java.util.Arrays;
import java.util.Collection;
import java.util.Scanner;

public class Main{
	int[] pre;
	public int Find(int x){	
		int fx = x;
		while(pre[fx] != fx){
			fx = pre[fx];
		}
		int i = x,j;
		while(pre[i]!=fx){
			j = pre[i];
			pre[i] = fx;
			i = j;
		}
		return fx;
	}
	
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[][] ms = new int[m][3];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < 3; j++) {
				ms[i][j] = sc.nextInt();
				
			}
		}

		Main d = new Main();
		d.pre = new int[n+1];
		for (int i = 0; i < d.pre.length; i++) {
			d.pre[i] = i;
		}
		
		Arrays.sort(ms, new Comparator<int[]>(){
            public int compare(int[] o1, int[] o2) {
            	return o1[2]-o2[2];
            }
        } );
		
		int ans = 0;
		for (int i = 0; i < ms.length; i++) {
			int x = d.Find(ms[i][0]);
			int y = d.Find(ms[i][1]);
			if(x<y)
				d.pre[y]=x;
			else 
				d.pre[x]=y;
			if(ans<ms[i][2]) ans = ms[i][2];
			
			if(d.Find(n)==1) break;
		}
		System.out.println(ans);
	}
}

发现只能得到70分,超时严重? ——然而用C++同样的方法不超时


想办法改进

Java中运算性能http://churchchen86.iteye.com/blog/2279130
Java关键字final、static使用总结:http://lavasoft.blog.51cto.com/62575/18771/


不知道为什么  别人用对象跑出来的比我还要快点?

JAVA版:http://blog.csdn.net/YANG_Gang2017/article/details/71893237

而且当我把Main。d 改了 不用对象演算 结果还慢了?(被扣了5分)

同理的C++写出来的是可以跑满分的 很难:

C++版:http://blog.csdn.net/dream_never_giveup/article/details/67637488#comments

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值