Algorithm training water problem time limit: 1.0s memory Limit: 64.0MB problem description There is a water room in the school, the water room is equipped with a total of M faucet for students to open water, each faucet per second of the same amount of water, are 1. Now there are n students ready to pick up water, and their initial water order has been determined. These students according to water order from 1 to n number, I number of students of the water intake is WI. When the water starts, 1 to m students each occupy a faucet, and at the same time turn on the tap to connect water. When one of the students J finished their water demand WJ, the next line of students waiting to receive the water, K immediately take over the position of J classmate began to connect water. The process of substitution is instantaneous, without any waste of water. That is, J classmate at the end of the first X seconds to complete the water, then K classmate x+1 seconds immediately began to pick up water. If the current number of water access n ' less than m, then only n ' Faucet water supply, the other m−n ' faucet closed. Now give the water intake of n students, according to the above water rules, ask all the students how many seconds to finish the water. Input format 1th line 2 integers n and m, separated by a space, respectively, indicating the number of water and faucet. Line 2nd n integers W1, w2 、......、 Wn, separated by a space between every two integers, WI indicates the water intake of the student I. Output format output is only one row, 1 integers, indicating the total time required to receive water. Sample Input 5 3
4 4 1 2 1 Sample Output 4 Example input 8 4
23 71 87 32 70 93 80 76 Sample Output 163 Input Output Example 1 description 1 seconds, 3 people connect. At the end of the 1th second, 1, 2, 3rd students each have received water of 1, 3rd students to finish
Water, 4th students to replace 3rd students began to pick up water.
The 2nd second, 3 people connect water. At the end of the 2nd second, 1, 2nd students each have received water of 2, 4th students have been connected
Water volume is 1.
The 3rd second, 3 people connect water. At the end of the 3rd second, 1, 2nd students each have received water of 3, 4th students have been connected
Water volume is 2. 4th students after the water, No. 5th students to replace the 4th students began to connect water.
The 4th second, 3 people connect water. At the end of the 4th second, 1, 2nd students each have received water of 4, 5th students have been connected
Water volume is 1. 1, 2, 5th students after the water, that is, all the water to complete.
The total water connection time is 4 seconds. Data size and convention 1≤n≤10000,1≤m≤100 and M≤n;
1≤wi≤100.
This is the title of the simulation, but really not difficult ... The first code (90 points): The comment part of the solution, why remove is right ... If you have any notice, we appreciate it.
# include <stdio.h> # include <algorithm> using namespace std;
int c[11111];
int cmp (int a, int b) {return a<b;} int max (int to) {int i;
int m=-65536;
for (I=1; i<=to; i++) if (C[i] > m) m = C[i];
return m;
} int main () {int sec=0;
int n,m;
int i;
scanf ("%d%d", &n, &m);
int k=m;
for (I=1; i<=n; i++) scanf ("%d", &c[i]);
if (n > M) {while (C[m] > 0) {sort (c+1, c+1+m, CMP);
while (C[1]) {for (i=1; i<=m; i++) c[i] = c[i]-1;
sec++; } if (C[m] <= 0)/* For this if you really do not understand *///////////{//////////////printf ("%d" , sec); Break
////////////////////////////////
} ///////////////////////////////////////////////////// C[1] = c[k+1];
if (k+1 = = N) {sec + = max (M);
printf ("%d", sec);
return 0;
} k++;
}} else printf ("%d", Max (n));
return 0; }
The following is the correct code (that is, remove the comment section above):
# include <stdio.h>
# include <algorithm>
using namespace std;
int c[11111];
int cmp (int a, int b)
{
return a<b;
}
int max (int to)
{
int i;
int m=-65536;
for (I=1; i<=to; i++)
if (C[i] > m)
m = c[i];
return m;
}
int main ()
{
int sec=0;
int n,m;
int i;
scanf ("%d%d", &n, &m);
int k=m;
for (I=1; i<=n; i++)
scanf ("%d", &c[i]);
if (n > M)
{while
(C[m] > 0)
{
sort (c+1, c+1+m, CMP);
while (C[1])
{for
(i=1; i<=m; i++)
c[i] = c[i]-1;
sec++;
}
C[1] = c[k+1];
if (k+1 = = N)
{
sec + = max (m);
printf ("%d", sec);
return 0;
}
k++;
}
}
else
printf ("%d", Max (n));
return 0;
}
My thinking is: If n<=m, then multiple taps at the same time water supply, that is, the direct output of the most water the person to hit the water spent time.
If n>m, someone will have to wait for the race, the first m personal to pick up the water sort, from small to large, then the first person finished the water, and then take the m+1 personal, replace to c[1] up. Reorder, c[1] and then replace, go down until C[m] is 0, and it's over. Here is a small optimization, that is, if no one has been waiting, then we will directly output the most water (no more calculation), right.