从数学角度来说这题不是什么难题。但是这题要通过所有test cases的话有几个细节需要注意:

  1. 一个test case可能有多组数据,一行表示一组。
  2. 新员工的人数是用总员工乘以离职率。不需要取整。
    • 例如:如果总员工99人,离职率10%,则离职人数为9.9人,不是9人也不是10人。
  3. 总的年龄是:(员工总数 - 新员工的人数) × 原有的公司平均年龄 + 新员工的人数 × 新员工平均年龄。不需要取整。
    • 此处假设未离职的员工平均年龄和原有所有员工的平均年龄相等。
    • 每过一年,原有的公司平均年龄要+1。
  4. 每一年新的平均年龄是:总年龄 / 员工总数。不需要取整。
  5. 直到最后一步,如果算出来不是整数的才往上取整。

完整代码如下:

import java.lang.*;
import java.io.*;
import java.util.*;
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNextLine()) {
            final int numTotalWorkers = sc.nextInt();
            float avgAge = sc.nextInt();
            final float departRate = sc.nextFloat();
            final int numYearsAfter = sc.nextInt();
            final int newWorkersAvgAge = 21;

            for (int year = 1; year <= numYearsAfter; ++year) {
                avgAge = getNextYearAvgAge(numTotalWorkers, avgAge, departRate,
                                           newWorkersAvgAge);
            }
            System.out.println((int)Math.ceil(avgAge));

            sc.nextLine();
        }

        sc.close();
    }

    private static float getNextYearAvgAge(final int numTotalWorkers,
                                         float avgAge,
                                         final float departRate,
                                         final int newWorkersAvgAge) {
        // note: does NOT need to round to nearest integer
        // otherwise it cannot pass the OJ system
        float numNewWorkers = numTotalWorkers * departRate; 

        avgAge += 1;
        float totalAge = (numTotalWorkers - numNewWorkers) * avgAge
            + numNewWorkers * newWorkersAvgAge;
        avgAge = totalAge / numTotalWorkers;
        return avgAge;
    }
}