您的位置:首页 > 编程语言 > Go语言

pku acm 1042 Gone Fishing

2010-06-28 17:54 351 查看
原题链接: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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: