medium
3 views

Jersey Number – Highest in Team

Find the highest jersey number in each team when students are divided into teams of size T with remaining students distributed round-robin

Understand the Problem

Problem Statement

In a school there are N students standing in a straight line. Their Jersey numbers from left to right are passed as the input. The students are to be divided into teams of size T starting from left. First T students form Team 1, next T students form Team 2 and so on. If N is not divisible by T and say the remainder is R, the R students are distributed among the teams formed so far in a round robin fashion (starting from the first team) until the R students are assigned to one of the teams.

Once the teams are formed, the program must print the highest jersey number in each team.

Constraints

  • 1 <= N <= 9999999
  • Team size T must be greater than 0
  • Jersey numbers are positive integers
  • When N is not divisible by T, the remainder students are distributed in round-robin fashion

Examples

Example 1
Input
10
1 5 8 2 4 11 20 6 7 9
5
Output
8 20
Explanation

With team size 5, first 5 students form Team 1 (max = 8) and next 5 form Team 2 (max = 20). No remainder students, so output is '8 20'.

Example 2
Input
10
1 5 8 2 4 11 3 6 9 7
4
Output
9 11
Explanation

With team size 4, first 4 students form Team 1 (max = 8), next 4 form Team 2 (max = 11). Remainder = 2, so students 9 and 7 are distributed: student 9 to Team 1 (new max = 9), student 7 to Team 2 (max remains 11). Final output: '9 11'.

Solution

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d", &n);
    
    int *jerseyNumbers = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) {
        scanf("%d", &jerseyNumbers[i]);
    }
    
    int t;
    scanf("%d", &t);
    
    int numTeams = n / t;
    int remainder = n % t;
    
    // Initialize team maxima with first member of each team
    int *teamMax = (int*)malloc(numTeams * sizeof(int));
    for (int i = 0; i < numTeams; i++) {
        teamMax[i] = jerseyNumbers[i * t];
    }
    
    // Find max in each team's base members
    for (int team = 0; team < numTeams; team++) {
        for (int member = 0; member < t; member++) {
            int index = team * t + member;
            if (jerseyNumbers[index] > teamMax[team]) {
                teamMax[team] = jerseyNumbers[index];
            }
        }
    }
    
    // Distribute remaining students round-robin
    for (int i = 0; i < remainder; i++) {
        int studentIndex = numTeams * t + i;
        int teamIndex = i; // Round-robin distribution
        
        if (jerseyNumbers[studentIndex] > teamMax[teamIndex]) {
            teamMax[teamIndex] = jerseyNumbers[studentIndex];
        }
    }
    
    // Print results
    for (int i = 0; i < numTeams; i++) {
        printf("%d ", teamMax[i]);
    }
    
    free(jerseyNumbers);
    free(teamMax);
    
    return 0;
}
Time:O(N) - We process each student exactly once to find team maxima
Space:O(N) - For storing jersey numbers and O(numTeams) for team maxima array
Approach:

C Solution Explanation:

  1. Allocate memory for jersey numbers array
  2. Read input values for N, jersey numbers, and team size T
  3. Calculate number of complete teams and remainder students
  4. Initialize team maxima array with first member of each team
  5. Loop through each team and find maximum among T base members
  6. For remaining students, distribute them round-robin and update team maxima if new student has higher number
  7. Print all team maxima separated by spaces
  8. Free allocated memory before exit

Visual Explanation

Loading diagram...