poj1042 枚举+贪心算法


import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;

/**
* poj1042 枚举+贪心算法
* @author NC
*/
public class Poj1042 {

public static void main(String[] args) {
Scanner scan = new Scanner(new BufferedInputStream(System.in));
while (scan.hasNext()) {
//输入
int n = scan.nextInt();
if (n == 0) {
break;
}
int h = scan.nextInt();
h = h * 12;//以5分钟为一个时间单位
int[] fish = new int[n];
int[] decrease = new int[n];
int[] interval = new int[n];
for (int i = 0; i < n; i++) {
fish[i] = scan.nextInt();
}
for (int i = 0; i < n; i++) {
decrease[i] = scan.nextInt();
}
interval[0] = 0;//interval[i]表示以第i个湖为终点时所花路程时间
for (int i = 1; i < n; i++) {
interval[i] = scan.nextInt() + interval[i - 1];
}

//先确定是以哪一个湖为终点,枚举求出最大的
//以第一个湖为终点
int[] maxResult = new int[n];
int max = maxFish(h, Arrays.copyOf(fish, 1), decrease, maxResult);
for (int i = 1; i < n; i++) {
if (h <= interval[i]) {
break;//时间不够,无法再走远了
}
//以第i个湖为终点
int[] result = new int[n];
int m = maxFish(h - interval[i], Arrays.copyOf(fish, i + 1), decrease, result);
if (m > max) {
max = m;
maxResult = Arrays.copyOf(result, result.length);
}
}
//输出结果
for (int i = 0; i < maxResult.length; i++) {
if (i > 0) {
System.out.print(", ");
}
System.out.print(maxResult[i] * 5);
}
System.out.println("");
System.out.println("Number of fish expected: " + max);
System.out.println("");
}
}

public static int maxFish(int time, int[] fish, int[] decrease, int[] result) {
int maxNumber = 0;
while (time > 0) {
int max = fish[0];
int maxIndex = 0;
for (int i = 1; i < fish.length; i++) {
if (fish[i] > max) {
max = fish[i];
maxIndex = i;
}
}
fish[maxIndex] -= decrease[maxIndex];//鱼每一个时间单位相应减少
if (fish[maxIndex] < 0) {
fish[maxIndex] = 0;//湖里的鱼是没有负数的
}
result[maxIndex]++;
maxNumber += max;
time--;
}
return maxNumber;
}
}

#include <stdio.h>
#include <memory.h>
//改成了c语言版的
void copy(int a[], int length, int b[]) {
int i = 0;
for (i = 0; i < length; i++) {
b[i] = a[i];
}
}

int maxFish(int end, int time, int fish[], int decrease[], int result[]) {
int i, maxNumber = 0, max, maxIndex;
while (time > 0) {
max = fish[0];
maxIndex = 0;
for (i = 1; i < end; i++) {
if (fish[i] > max) {
max = fish[i];
maxIndex = i;
}
}
fish[maxIndex] -= decrease[maxIndex]; //鱼每一个时间单位相应减少
if (fish[maxIndex] < 0) {
fish[maxIndex] = 0; //湖里的鱼是没有负数的
}
result[maxIndex]++;
maxNumber += max;
time--;
}
return maxNumber;
}

int main() {
int n, h, i;
int fish[25] = {0}, decrease[25] = {0}, interval[25] = {0}, maxResult[25] = {0}, temp[25] = {0}, result[25] = {0};
while (scanf("%d", &n) && n != 0) {
memset(fish, 0, sizeof (fish));
memset(decrease, 0, sizeof (decrease));
memset(interval, 0, sizeof (interval));
memset(maxResult, 0, sizeof (maxResult));
memset(interval, 0, sizeof (interval));
//输入
scanf("%d", &h);
h = h * 12; //以5分钟为一个时间单位
for (i = 0; i < n; i++) {
scanf("%d", &fish[i]);
}
for (i = 0; i < n; i++) {
scanf("%d", &decrease[i]);
}
interval[0] = 0; //interval[i]表示以第i个湖为终点时所花路程时间
for (i = 1; i < n; i++) {
scanf("%d", &interval[i]);
interval[i] += interval[i - 1];
}
//先确定是以哪一个湖为终点,枚举求出最大的
//以第一个湖为终点
copy(fish, 1, temp);
int max = maxFish(1, h, temp, decrease, maxResult);
for (int i = 1; i < n; i++) {
if (h <= interval[i]) {
break; //时间不够,无法再走远了
}
//以第i个湖为终点
memset(result, 0, sizeof (result));
copy(fish, i + 1, temp);
int m = maxFish(i + 1, h - interval[i], temp, decrease, result);
if (m > max) {
max = m;
memset(maxResult, 0, sizeof (maxResult));
copy(result, i + 1, maxResult);
}
}
//输出结果
for (i = 0; i < n; i++) {
if (i > 0) {
printf(", ");
}
printf("%d", maxResult[i] * 5);
}
printf("\n");
printf("Number of fish expected: %d", max);
printf("\n");
printf("\n");
}
return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值