从数学角度来说这题不是什么难题。但是这题要通过所有test cases的话有几个细节需要注意:
- 一个test case可能有多组数据,一行表示一组。
- 新员工的人数是用总员工乘以离职率。不需要取整。
- 例如:如果总员工99人,离职率10%,则离职人数为9.9人,不是9人也不是10人。
- 总的年龄是:(员工总数 - 新员工的人数) × 原有的公司平均年龄 + 新员工的人数 × 新员工平均年龄。不需要取整。
- 此处假设未离职的员工平均年龄和原有所有员工的平均年龄相等。
- 每过一年,原有的公司平均年龄要+1。
- 每一年新的平均年龄是:总年龄 / 员工总数。不需要取整。
- 直到最后一步,如果算出来不是整数的才往上取整。
完整代码如下:
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; } }