NYOJ 30

View Code
 1 /*

 2 思路:

 3 枚举 + 贪心

 4 首先枚举只在前  i 个Lake钓鱼(1<=i<=n)

 5 因为每段路上只走一次  那么总时间减去 从第一个Lake到第  i 个Lake

 6 路上所花的时间 ,剩下的时间就是钓鱼所用的时间(这样就可以这样处理:

 7 从一个Lake可以立即到另一个Lake)这就可以利用贪心 每次在 期待鱼最多的

 8 Lake中钓鱼了 

 9 */ 

10 #include<iostream>

11 #include<cstdio>

12 #include<cstring>

13 using namespace std;

14 

15 const int size = 26;

16 

17 int fish[size];//记录每个湖前五分钟期待的可以得到的鱼的数目 

18 int de[size];//每一个间隔鱼减少的数目 

19 int tinum[size];//tinum[i]记录到达 第  i 个 lake 的时间间隔数目 

20 int tempfish[size];//临时保存 每个 lake鱼的原值 

21 int ftime[size];//记录最终 每个Lake所花的时间 

22 int temptime[size];//临时存放  每个Lake所花时间的中间值 

23 

24 int slove(int m,int h,int n)

25 {

26    int i,j,total=0,ma;

27    memset(temptime,0,sizeof(temptime));

28    h*=12;//(12==60/5) 

29    h-=tinum[m];//总时间减去到达  Lake  m 的时间 

30    while(h>0)

31     {

32        int ma=0;//从第一个开始搜所以 结果符合 尽量在前的要求 

33        for(i=1;i<=m;++i)//每个时间段  都找期待值最大的湖钓鱼 

34         {

35           if(tempfish[i]>ma)

36            {

37              ma=tempfish[i];

38              j=i;

39            }

40         }

41        if(ma<=0)

42        {

43         temptime[1]+=h;//所剩时间都加在  Lake 1上 

44         break;

45        }

46        total+=tempfish[j];

47        tempfish[j]-=de[j];//这个湖的期待鱼减少 

48        temptime[j]++;//在这个湖所花时间增加 

49        h--;

50     }

51    return total;

52 }

53 

54 int main()

55 {

56    int n,i,h,j;

57    while(scanf("%d",&n)&&n)

58     {

59        scanf("%d",&h);

60        for(i=1;i<=n;++i)

61         scanf("%d",&fish[i]);

62        for(i=1;i<=n;++i)

63         scanf("%d",&de[i]);

64        tinum[1]=0;

65        for(i=2;i<=n;++i)

66         {

67           scanf("%d",&tinum[i]);

68           tinum[i]+=tinum[i-1];

69         }

70        int sum=0,total;

71        for(i=1;i<=n;++i)

72         {

73           for(j=1;j<=n;++j)

74            tempfish[j]=fish[j];

75           total=slove(i,h,n);

76           if(total>sum)

77            {

78              sum=total;

79              for(j=1;j<=n;++j)

80               ftime[j]=temptime[j];

81            }

82         }

83       for(i=1;i<n;++i)

84        printf("%d, ",ftime[i]*5);

85       printf("%d\n",ftime[n]*5);

86       printf("Number of fish expected: %d\n\n",sum);

87     }

88    return 0;

89 }

 

你可能感兴趣的:(OJ)