Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:注意酋长一开始要的钱不一定是10000In Reply To:注意酋长一开始要的钱不一定是10000 Posted by:spacelovezy at 2014-11-29 22:59:00 import java.util.Scanner; public class Main { public final static int MAX_VALUE = 99999999; int M; int N; int length; People[] peoples; int min; int max; public Main(int M, int N) { this.M = M; this.N = N; peoples = new People[N + 1]; for (int i = 0; i <= N; i++) peoples[i] = new People(i); } public People createPeople(int id, int level) { peoples[id].setLevel(level); return peoples[id]; } public Edge createEdge(int id, int length) { return new Edge(id, length); } public void recovery() { // System.out.println("this min:"+min+" max:"+max); peoples[0].isVisit = false; for (int i = 1; i <= N; i++) { peoples[i].setLength(MAX_VALUE); peoples[i].isVisit = false; } } public class People { int id; int level; int length; Edge head; Edge tail; boolean isVisit; public People(int id) { this.id = id; } public void append(Edge edge) { if (head == null) { head = edge; tail = edge; } else { this.tail.next = edge; this.tail = edge; } } public boolean isSuitable(int length) { if (this.length < length && !isVisit && this.level >= min && this.level <= max) return true; return false; } public void setLevel(int level) { this.level = level; } public void setLength(int length) { this.length = length; } } public class Edge { int id; int length; Edge next=null; public Edge(int id, int length) { this.id = id; this.length = length; } } public People getSuitablePeople() { int length = MAX_VALUE+1; People people = null; for (int i = 0; i < peoples.length; i++) { if (peoples[i].isSuitable(length)) { length = peoples[i].length; people = peoples[i]; } // System.out.println(i + " " + peoples[i].length); } people.isVisit = true; return people; } public int getMinLength() { while (!peoples[1].isVisit) { People people = getSuitablePeople(); // System.out.println("Suitable id:" + people.id); Edge edge = people.head; while (edge != null) { if (people.length + edge.length < peoples[edge.id].length) { peoples[edge.id].length = people.length + edge.length; } edge = edge.next; } } return peoples[1].length; } public int getMostMinLength(int min, int max) { int length = MAX_VALUE; peoples[0].level =peoples[1].level; for (int i = min; i <= max - M; i++) { this.min = i; this.max = i + M; if (this.min + M < peoples[1].level) continue; if (this.min > peoples[1].level) break; recovery(); if (length > getMinLength()) { length = getMinLength(); } } return length; } public static void main(String args[]) { Scanner scanner = new Scanner(System.in); int M, N; int min = MAX_VALUE, max = 0; M = scanner.nextInt(); N = scanner.nextInt(); Main main = new Main(M, N); for (int i = 1; i <= N; i++) { int P, L, X; P = scanner.nextInt(); L = scanner.nextInt(); if (L < min) min = L; if (L > max) max = L; X = scanner.nextInt(); People people = main.createPeople(i, L); Edge edge = main.createEdge(i, P); main.peoples[0].append(edge); for (int j = 0; j < X; j++) { int T, V; T = scanner.nextInt(); V = scanner.nextInt(); Edge edge1 = main.createEdge(T, V); people.append(edge1); Edge edge2 = main.createEdge(i, V); main.peoples[T].append(edge2); } } System.out.println(main.getMostMinLength(min, max)); } } 感觉没什么问题啊啊 怎么老WA 呢 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator