pku acm 1042 Gone Fishing

原题链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1042

题目大概意思如下:

john去某湖泊钓鱼。他有1到16个小时的整数时间用来钓鱼,湖泊的数量为2到25。john必须从湖泊1开始选择钓鱼,

同时他可以选择从在任何一个湖泊钓鱼。同时呢,他只能从编号小的湖泊往编号大的湖泊前进,也就是说,如果他现在正在3号

湖泊钓鱼,那么他就不能再去1号和2号湖泊钓了。同时,从第i个湖泊到第i+1个湖泊要ti时间的路程。在第i个湖泊边钓鱼,第一

个5分钟可以钓鱼K条,以后再钓鱼5分钟,鱼量减小P。注意这5分钟为最小时间单位

输入的第一行为湖泊的数量n

第二行为钓鱼的可用时间数,以小时记

第三行为n个整数,表示第i个湖泊第一个5分钟的钓鱼数量

第四行为n个整数,表示第i个湖泊再钓鱼5分钟的鱼量减小值p

第五行为n-1个整数,表示从第i个湖泊到第i+1个湖泊所需要的时间数(以5分钟为单位)

如果是4,表示需要20分钟

输入以0表示结束

输出john在每个湖泊的停留时间数以及可能钓到的最大数量的鱼

注意如果存在相同的最优解,那么要选择序号小的湖泊停留时间相对长的那个

主要思想枚举+贪心

从第一个湖泊开始,依次枚举从1到i的湖泊,

从总的时间里把从1到i号湖泊路程上所用的时间减去,

然后对这些湖泊采用贪心原则,每次选择鱼量最多的湖泊开始钓

如果半路发现所有的湖泊已经没有鱼,但是时间还没有用完,那么把剩余的时间加到第一个湖泊上就行了

我搞了几个wrong answer就是因为这个没有ac

上java代码:

package com.yaowei.acm.problem_10xx; import java.util.Scanner; public class Problem_1042 { public static void main(String[]args) throws Exception { Scanner scanner = new Scanner(System.in); //湖的数目 int numberOfLake = 0; //初始湖的钓鱼数量 int []fishOfLake; //在湖里钓鱼5分钟,鱼量减少的数目 int []minusOfLake; //钓鱼总共可用的时间 int totalTime; //从一个湖到另一个湖所用的时间 int []timeOfUse; //结果数组 int []resultOfTime; while(true) { String s = scanner.nextLine(); if(s.equals("0")) { break; } numberOfLake = Integer.parseInt(s.trim()); fishOfLake = new int[numberOfLake]; resultOfTime = new int[numberOfLake]; minusOfLake = new int[numberOfLake]; timeOfUse = new int[numberOfLake - 1]; s = scanner.nextLine(); totalTime = Integer.parseInt(s.trim())*60; s = scanner.nextLine(); String[]temp = s.trim().split("[ ]+"); for(int i=0;i<numberOfLake;i++) { fishOfLake[i] = Integer.parseInt(temp[i]); } s = scanner.nextLine().trim(); temp = s.split("[ ]+"); for(int i=0;i<numberOfLake;i++) { minusOfLake[i] = Integer.parseInt(temp[i]); } s = scanner.nextLine().trim(); temp = s.split("[ ]+"); for(int i=0;i<numberOfLake - 1;i++) { timeOfUse[i] = Integer.parseInt(temp[i])*5; } //开始计算 int totalFish = 0; int maxIndex = -1; int maxNumber = 0; //枚举 for(int i=0;i<numberOfLake;i++) { int tempTotalTime = totalTime; int[]tempFishOfLake = new int[numberOfLake]; for(int j=0;j<numberOfLake;j++) { tempFishOfLake[j] = fishOfLake[j]; } int[]tempResultOfTime = new int[numberOfLake]; for(int j=0;j<numberOfLake;j++) { tempResultOfTime[j] = 0; } int tempTotalFish = 0; maxNumber = -1; maxIndex = -1; for(int j=0;j<i;j++) { tempTotalTime -= timeOfUse[j]; } while(tempTotalTime > 0) { maxNumber = 0; maxIndex = -1; for(int j=0;j<=i;j++) { if(tempFishOfLake[j] > maxNumber) { maxNumber = tempFishOfLake[j]; maxIndex = j; } } if(maxIndex == -1) { tempResultOfTime[0] += tempTotalTime; break; } tempTotalTime -=5; tempResultOfTime[maxIndex] +=5; tempTotalFish += tempFishOfLake[maxIndex]; tempFishOfLake[maxIndex] -= minusOfLake[maxIndex]; } if(tempTotalFish > totalFish) { totalFish = tempTotalFish; resultOfTime = tempResultOfTime; }else if(tempTotalFish == totalFish) { for(int j=0;j<tempResultOfTime.length;j++) { if(tempResultOfTime[j] != resultOfTime[j]) { if(tempResultOfTime[j] > resultOfTime[j]) { for(int k=0;k<tempResultOfTime.length;k++) { resultOfTime[j] = tempResultOfTime[j]; } break; }else { for(int k=0;k<tempResultOfTime.length;k++) { tempResultOfTime[j] = resultOfTime[j]; } break; } } } } } //计算完毕,输出结果 for(int i=0;i<numberOfLake-1;i++) { System.out.print(resultOfTime[i]+", "); } System.out.println(resultOfTime[numberOfLake-1]); System.out.println("Number of fish expected: "+totalFish); System.out.println(); } } }

你可能感兴趣的:(java,exception,String,Class)