2012谷歌挑战赛CodeJam Round 1A problem B

来源:互联网 发布:linux eth0配置 编辑:程序博客网 时间:2024/05/22 09:42

原题目:https://code.google.com/codejam/contest/1645485/dashboard#s=p1

中文意思:    瑞安在玩单人塔防游戏Kingdom Rush。

                  比赛规则如下:

                  每一个关卡有1级和2级两种,玩家赚取星星的方法如下:

                  如果这是玩家从未完成前的关卡,并完成1级,则该玩家获得1星星。
                 如果这是玩家从未完成前的关卡,并完成2级,则该玩家获得2星星。
                 如果这是玩家只完成1级的关卡,并完成这一次的2级,则该玩家获得1星星。
                 除此之外没有办法赚取星星。

每一个等级都需要一定的数量来开始,玩家从0颗星星开始。现在要求至少要多少次玩家才能完成所有的关卡2,如果没法完成则输出“Too Bad”。

输入的第一行的总测试数,接着是关卡数N。接着的N行,第一列为该关卡开始等级1所需要的星星数,第二列为开始等级2所需要的星星数.
例如:
第一个测试例子:
2
0 1
0 2
玩家开始星星数是0,可以选择关卡1,和2.选择1的等级1,完成,获得1星星,完成等级2,获得1星星,共2星星,可以满足关卡2的等级2的数目,去完成。共3次。输出
Case #1: 3

Sample


输入
 
输出
 4
2
0 1
0 2
3
2 2
0 0
4 4
1
1 1
5
0 5
0 1
1 1
4 7
5 6
Case #1: 3
Case #2: 3
Case #3: Too Bad
Case #4: 6
java源码:
  
import java.io.FileReader;import java.io.FileWriter;import java.io.PrintWriter;import java.util.Scanner;/** *  * @author hortondland@gmail.com * @date  2013.04.18 * */public class KingdomRush {final static String PROBLEM_NAME = KingdomRush.class.getName();static int[][] stars;    static boolean[][] finished;    static int currentStars = 0, beatCount = 0;public static void solve(Scanner sc, PrintWriter pw) {currentStars = 0;beatCount = 0 ;int N = sc.nextInt();finished = new boolean[N][2];  stars = new int[N][2];for (int i = 0; i < stars.length; i++) {stars[i][0] = sc.nextInt();stars[i][1] = sc.nextInt();}for (int i = 0; i < finished.length; i++) {finished[i][0] = false;finished[i][1] = false;}while(!allLeve2finished()){beatNextLevel();if( beatCount > N*2+1){pw.println("Too Bad");System.out.println("Too Bad");    return;}}pw.println(beatCount);System.out.println(beatCount);return;}  /**用贪心算法按照当前星星数,选择下一个满足的关卡 *  */private static void beatNextLevel() {beatCount++;//因为从等级2开始获得的星星数最多。for (int i = 0; i < stars.length; i++) {if(finished[i][1]==false){if( currentStars >= stars[i][1] ){finished[i][1] = true;currentStars += getStars(i,2);return;}else{continue;}}}if(allLeve2finished()){return;}int[][] start2 = new int[stars.length][2];for (int j = 0; j < start2.length; j++) {start2[j][0] = -1;start2[j][1] = -1;}for (int i = 0; i < stars.length; i++) {if(finished[i][0]==false){if( currentStars >= stars[i][0] ){start2[i] = stars[i].clone();}else{continue;}}}//当等级1的需要星星数相同时,选择该关卡的等级2最大的那个完成,//因为有种情况是,有些关卡如果完成了等级1,再完成等级2,次数会浪费一个,结果就可能不是最优解。int maxinCurL2 = -1 ,maxCol = -1;for (int i = 0; i < start2.length; i++) {if (start2[i][1] > maxinCurL2){maxinCurL2 = start2[i][1];maxCol = i;}}if(maxCol!=-1){finished[maxCol][0] = true;currentStars += getStars(maxCol,1);}return;}/** *  * @param curN  当前关卡 * @param Level 等级1或等级2 * @return 星星数 */private static int getStars(int curN, int Level) {if(Level==1){if(finished[curN][1] == false){return 1;}else{return 0;}}if(Level==2){if(finished[curN][0] == false){return 2;}else{return 1;}}return Integer.MAX_VALUE;}private static boolean allLeve2finished() {for (int i = 0; i < finished.length; i++) {if(finished[i][1] == false){return false;}}return true;}public static void main(String[] args) throws Exception {System.out.println("Start...");Scanner sc = new Scanner(new FileReader(PROBLEM_NAME));PrintWriter pw = new PrintWriter(new FileWriter(PROBLEM_NAME+ "output.txt"));int caseCnt = sc.nextInt();for (int caseNum = 0; caseNum < caseCnt; caseNum++) { System.out.println("Processing test case " + (caseNum + 1));if((caseNum + 1)==3){System.out.println();}pw.print("Case #" + (caseNum + 1) + ": ");            solve(sc, pw);}pw.flush();pw.close();sc.close();System.out.println("done");}}