pku acm 1042 “gone fishing” 出现“wrong answer”
这是原题地址http://题目大概意思是这样的:在一条水平路边,有n(2<=n<=25)个湖,从左到右序号为1,2,3…n。佳佳有H个小时的空余时间,他希望用这些时间钓鱼。他从1号湖出发向右走,有选择地在一些湖边停留一定的时间来钓鱼,最后在某个湖边结束钓鱼。他已测出,从第i个湖到第i+1个湖要走Ti分钟的路。他还测出,在第i个湖的第一个5分钟可钓鱼Fi条,以后每钓鱼5分钟,可钓鱼量减少Di。假定没有其他人钓鱼,也不受其他因素影响,编程求出佳佳钓鱼最多的方案。
用的是枚举加贪心的算法,提交后显示“wrong answer”,也就是结果错误,但是已经给出的输入输出范例在这个程序中都是切合的,所以我不知道是在什么样的输入情况下会出现结果错误,麻烦各位大虾帮我看下,是什么情况下会结果错误,或是指出我有可能忽略了的某个重要问题。。多谢!
下面是C程序代码:
程序代码:
#include <stdio.h> #include <stdlib.h> void f_DataCopy(int *, int *, int); int f_BestProject(int *, int *, int *, int, int); void f_print(int *, int); int f_max(int *, int); int main() { int i, j, tmp; int n, h, min_5, num = 0; int * _fi; //暂时保存fi,便于还原fi int * fi; //第i个湖泊每5分钟能钓到的鱼 int * di; //第i个湖泊每间隔5分钟钓到鱼的减少量 int * ti; //从第i个到第i+1个湖泊所需时间(5分钟为单位) int * Tmp; //用于暂时存放时间分配情况 int * Ti; //在第i个湖泊停留的时间 scanf("%d", &n); while (n) { _fi = (int *)malloc(n * sizeof(int)); fi = (int *)malloc(n * sizeof(int)); di = (int *)malloc(n * sizeof(int)); ti = (int *)malloc((n-1) * sizeof(int)); Ti = (int *)malloc(n * sizeof(int)); Tmp = (int *)malloc(n * sizeof(int)); scanf("%d", &h); min_5 = h * 60 / 5; for (i = 0; i < n; i++) scanf("%d", &fi[i]); for (i = 0; i < n; i++) scanf("%d", &di[i]); for (i = 0; i < n-1; i++) scanf("%d", &ti[i]); for (i = 0; i < n; i++) Ti[i] = 0; for (i = 0; i < n; i++) Tmp[i] = 0; f_DataCopy(_fi, fi, n); //枚举最后一个岛的可能情况 for (i = 0; i < n; i++) { if (i != 0) for (j = 0; j < i; j++) min_5 -= ti[j]; if ( (tmp = f_BestProject(fi, di, Tmp, i+1, min_5)) > num ) { num = tmp; f_DataCopy(Ti, Tmp, n); } //还原fi,min_5及数组Tmp[]为初始值 f_DataCopy(fi, _fi, n); min_5 = h * 60 / 5; for (j = 0; j < n; j++) Tmp[j] = 0; } f_print(Ti, n); printf("Number of fish expected: %d\n\n", num); free(_fi); free(fi); free(di); free(ti); free(Ti); free(Tmp); num = 0; scanf("%d", &n); } return 0; } //在确定最后一个岛的情况下取得最优解 int f_BestProject(int * fi, int * di, int * Tmp, int n1, int min_5) { int i, j; int num = 0; for (i = min_5; i > 0; i--) { j = f_max(fi, n1); Tmp[j]++; if (fi[j] > 0) num += fi[j]; fi[j] -= di[j]; } return num; } //按格式输出 void f_print(int * Ti, int n) { int i; for (i = 0; i < n; i++) { if (i == n-1) printf("%d\n", Ti[i] * 5); else printf("%d, ", Ti[i] * 5); } } //将等长的string2复制到string1 void f_DataCopy(int * string1, int * string2, int n) { int i; for (i = 0; i < n; i++) string1[i] = string2[i]; } //取得数组中前n个数中最大数的下标 int f_max(int * fi, int n1) { int i, j = 0; int tmp = fi[0]; for (i = 1; i < n1; i++) { if (fi[i] > tmp && fi[i] > 0) { tmp = fi[i]; j = i; } } return j; }
[ 本帖最后由 lyhlyhlyhboa 于 2013-10-10 19:13 编辑 ]