Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

贴Java代码。排序后贪心(带注释)

Posted by haqishen at 2015-01-05 12:29:37 on Problem 2392
import java.util.*;

public class Main{

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		
//              输入数据后按a升序排序
		int K = s.nextInt();
		block blocks[] = new block[K];
		for(int i = 0; i < K; i ++){
			blocks[i] = new block();
			blocks[i].h = s.nextInt();
			blocks[i].a = s.nextInt();
			blocks[i].c = s.nextInt();
		}
		Arrays.sort(blocks);

//              初始化布尔数组。值为true代表可以到达该高度。
		boolean ok[] = new boolean[40001];
		for(int i = 1; i < 40001; i++)
			ok[i] = false;
		ok[0] = true;
 
//              这里我用动态数组来保存可以到达的所有高度
//              想要稍微降低空间复杂度也可以选择用一维数组
		ArrayList<Integer> al = new ArrayList<Integer>();
		al.add(0);
		
//              循环所有类型的block
		for(int i = 0; i < K; i ++){
			int len = al.size();
//                      循环用该block之前的所有block能达到的所有高度
			for(int j = 0; j < len; j++){
				int index = al.get(j);
//                              循环该block的数量
				for(int n = 1; n <= blocks[i].c; n++){
					int h = index + n*blocks[i].h;
//                                      剪枝条件*2
					if(h > blocks[i].a) break;
					if(ok[h]) break;

//                                      如果到达了新的高度,则加入al
					ok[h] = true;
					al.add(h);
				}
			}
		}

//              最后输出最大的高度
		for(int i = 40000; i >= 0; i--){
			if(ok[i]){
				System.out.println(i);
				break;
			}
		}
	}
}

class block implements Comparable<block>{
	int h, a, c;
	public int compareTo(block o) {
		return this.a - o.a;
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator