This is a standard greedy algorithm. The general meaning of the question is: Now I am giving you some water ponds. Now the child is in the pond 1. Now I am going to fish. At the beginning, Each pond has a fixed number of fish, the number of fish caught every 5 minutes decreases accordingly. When the current number of fish caught in the pond is less than or equal to 0, the number of fish caught each time cannot be caught next time, of course, there is a certain interval between the pond and the pond, this interval is reflected in the time consumed from I to I + 1. Of course, ti * 5 is the real time. Now, I want to give you the time this kid can fish and ask him how many fish he can catch, and ask him to output the time spent in each pond. The practice of this question is that if we know which pond we stop fishing at the end, then of course we will not go back from pond I once, and all the rest of the time will be used for fishing. The problem now is how to arrange the fishing time in these ponds. Of course, we should first choose the pond with the most fish in the first five minutes, then the fish in the pond will lose the number of fish reduced each time, and the next 5 minutes will continue. Note that the output of the question has a requirement, which makes it necessary to calculate the case of the last stuck in the first Lake separately. This question implies that all the time must be exhausted, even if no fish can be caught.
See the program below.
[Cpp]
<SPAN style = "FONT-SIZE: 18px"> # include <iostream>
# Include <stdio. h>
Using namespace std;
Int start [26], change [26], stay [26], compare [26], de [26], dis [26];
Int main ()
{
Int n, h, I, time, sum, used, flag, maxi, j, jilu, sumc;
While (cin> n)
{
If (n = 0)
Break;
Cin> h;
H = h * 60;
For (I = 1; I <= n; I ++)
Scanf ("% d", & start [I]);
Start [0] = 0;
For (I = 1; I <= n; I ++)
Scanf ("% d", & de [I]);
For (I = 1; I <n; I ++)
{
Scanf ("% d", & dis [I]);
Dis [I] = 5 * dis [I];
}
Dis [0] = 0;
For (I = 1; I <= n; I ++)
Stay [I] = 0;
Sum = 0;
Time = h;
Change [1] = start [1];
For (I = 1; I <= n; I ++)
Stay [I] = 0;
While (time> 0)
{
Sum = sum + change [1];
Change [1] = change [1]-de [1];
If (change [1] <0)
Change [1] = 0;
Time = time-5;
Stay [1] = stay [1] + 5;
}
Used = 0;
For (I = 2; I <= n; I ++)
{
Sumc = 0;
Used = used + dis [I-1];
Time = h-used;
Flag = 1;
For (j = 1; j <= n; j ++)
{
Change [j] = start [j];
Compare [j] = 0;
}
While (time> 0)
{
Maxi = 0;
Jilu = 1;
For (j = 1; j <= I; j ++)
{
If (change [j]> maxi)
{
Maxi = change [j];
Jilu = j;
}
}
Sumc = sumc + maxi;
Change [jilu] = change [jilu]-de [jilu];
Compare [jilu] = compare [jilu] + 5;
If (change [jilu] <0)
Change [jilu] = 0;
Time = time-5;
}
If (sumc> sum)
{
Sum = sumc;
For (int k = 1; k <= n; k ++)
Stay [k] = compare [k];
}
}
For (I = 1; I <n; I ++)
Cout <stay [I] <",";
Cout <stay [n] <endl;
Cout <"Number of fish expected:" <sum <endl;
}
Return 0;
}
</SPAN>
# Include <iostream>
# Include <stdio. h>
Using namespace std;
Int start [26], change [26], stay [26], compare [26], de [26], dis [26];
Int main ()
{
Int n, h, I, time, sum, used, flag, maxi, j, jilu, sumc;
While (cin> n)
{
If (n = 0)
Break;
Cin> h;
H = h * 60;
For (I = 1; I <= n; I ++)
Scanf ("% d", & start [I]);
Start [0] = 0;
For (I = 1; I <= n; I ++)
Scanf ("% d", & de [I]);
For (I = 1; I <n; I ++)
{
Scanf ("% d", & dis [I]);
Dis [I] = 5 * dis [I];
}
Dis [0] = 0;
For (I = 1; I <= n; I ++)
Stay [I] = 0;
Sum = 0;
Time = h;
Change [1] = start [1];
For (I = 1; I <= n; I ++)
Stay [I] = 0;
While (time> 0)
{
Sum = sum + change [1];
Change [1] = change [1]-de [1];
If (change [1] <0)
Change [1] = 0;
Time = time-5;
Stay [1] = stay [1] + 5;
}
Used = 0;
For (I = 2; I <= n; I ++)
{
Sumc = 0;
Used = used + dis [I-1];
Time = h-used;
Flag = 1;
For (j = 1; j <= n; j ++)
{
Change [j] = start [j];
Compare [j] = 0;
}
While (time> 0)
{
Maxi = 0;
Jilu = 1;
For (j = 1; j <= I; j ++)
{
If (change [j]> maxi)
{
Maxi = change [j];
Jilu = j;
}
}
Sumc = sumc + maxi;
Change [jilu] = change [jilu]-de [jilu];
Compare [jilu] = compare [jilu] + 5;
If (change [jilu] <0)
Change [jilu] = 0;
Time = time-5;
}
If (sumc> sum)
{
Sum = sumc;
For (int k = 1; k <= n; k ++)
Stay [k] = compare [k];
}
}
For (I = 1; I <n; I ++)
Cout <stay [I] <",";
Cout <stay [n] <endl;
Cout <"Number of fish expected:" <sum <endl;
}
Return 0;
}