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

uva757 - - Gone Fishing

2016-03-09 22:14 405 查看
一道很典型的贪心题,根据贪心决策,枚举会走到的湖泊(不走回头路),从最开始的湖泊依次到会走到的湖泊里钓鱼,扣除驾车时间后,将剩余时间划分为每次5分钟的时间段,在这些时间段里,贪心地找当前鱼最多的湖泊里钓鱼(因为扣除驾车时间,仅需考虑到哪钓鱼即可),若时间用不完,则剩余时间加到第一个钓鱼地点上。

代码如下:

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int f[30], tf[30];
int d[30];
int staytime[30];
int drivetime[30];
int maxcnt;
int timecnt[30];
int main() {
int n, h, th;
int Case = 0;
while (scanf("%d", &n) && n) {
scanf("%d", &th);
th *= 60;
maxcnt = -1;
int i;
for (i = 0; i < n; i++)
scanf("%d", &f[i]);
for (i = 0; i < n; i++)
scanf("%d", &d[i]);
int t;
drivetime[0] = 0;
for (i = 1; i < n; i++) {
scanf("%d", &t);
drivetime[i] = t * 5 + drivetime[i - 1];
}
//memset(timecnt,0,sizeof(timecnt));
int cnt;
for (i = 0; i < n; i++) {//枚举要走到第几个湖
h = th;
int j;
for (j = 0; j < n; j++) {
tf[j] = f[j];
staytime[j] = 0;
}
h -= drivetime[i];
cnt = 0;
int maxindex;
int max;
//  printf("%d",h);
//  printf("i:%d\n", i);
while (h > 0){
//找到鱼最多的鱼塘,记录在maxindex里

max = tf[0]; maxindex = 0;
for (j = 1; j <= i; j++){
if (max < tf[j]) {
max = tf[j];
maxindex = j;
}
}
//  printf("max:%d",max);
//去该鱼塘抓鱼
if (max == 0){
staytime[0] += 5;
}
else {
//printf("syindex:%d,cnt:%d\n",staytime[maxindex],cnt);
if (tf[maxindex] >= d[maxindex]) {
cnt += tf[maxindex];
tf[maxindex] -= d[maxindex];
staytime[maxindex] += 5;
}
else {
staytime[maxindex] += 5;
cnt += max;
tf[maxindex] = 0;
}

}
h -= 5;
}
if (maxcnt < cnt) {
maxcnt = cnt;
for (j = 0; j < n; j++) {
//printf("syindex:%d,cnt:%d\n", staytime[j], cnt);
timecnt[j] = staytime[j];
}
}
}
if (Case > 0)
printf("\n");
for (i = 0; i < n-1; i++)
printf("%d, ", timecnt[i]);
printf("%d\n",timecnt[n-1]);
printf("Number of fish expected: %d\n", maxcnt);
Case++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: