解题思路
这是一道数学计算问题,主要思路如下:
-
问题分析:
- 已知公司总人数
,当前平均年龄
- 每年离职率
,新员工年龄
岁
- 需要计算
年后的平均年龄
- 已知公司总人数
-
解决方案:
- 每年的平均年龄计算公式:
- 留任员工:
- 新入职员工:
- 留任员工:
- 最终年龄 = 留任员工年龄 + 新员工年龄
- 迭代
次得到最终结果
- 每年的平均年龄计算公式:
-
关键点:
- 每年都要更新平均年龄
- 结果需要向上取整
- 注意浮点数精度
- 每年都要更新平均年龄
代码
#include <iostream>
#include <cmath>
using namespace std;
// 计算一年后的平均年龄
float calculateNextYear(float currentAge, double leaveRate) {
// 留任员工年龄增长1岁
float stayEmployees = (1 - leaveRate) * (currentAge + 1);
// 新员工固定21岁
float newEmployees = leaveRate * 21;
// 返回新的平均年龄
return stayEmployees + newEmployees;
}
int main() {
int W, N;
float Y, x;
while (cin >> W >> Y >> x >> N) {
float averageAge = Y;
// 模拟N年
for (int i = 0; i < N; i++) {
averageAge = calculateNextYear(averageAge, x);
}
// 向上取整并输出
cout << ceil(averageAge) << endl;
}
return 0;
}
import java.util.*;
public class Main {
// 计算一年后的平均年龄
private static float calculateNextYear(float currentAge, double leaveRate) {
// 留任员工年龄增长1岁
float stayEmployees = (float)((1 - leaveRate) * (currentAge + 1));
// 新员工固定21岁
float newEmployees = (float)(leaveRate * 21);
// 返回新的平均年龄
return stayEmployees + newEmployees;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int W = sc.nextInt();
float Y = sc.nextFloat();
float x = sc.nextFloat();
int N = sc.nextInt();
float averageAge = Y;
// 模拟N年
for (int i = 0; i < N; i++) {
averageAge = calculateNextYear(averageAge, x);
}
// 向上取整并输出
System.out.println((int)Math.ceil(averageAge));
}
}
}
import math
def calculate_next_year(current_age: float, leave_rate: float) -> float:
# 留任员工年龄增长1岁
stay_employees = (1 - leave_rate) * (current_age + 1)
# 新员工固定21岁
new_employees = leave_rate * 21
# 返回新的平均年龄
return stay_employees + new_employees
while True:
try:
# 读取输入
W, Y, x, N = map(float, input().split())
N = int(N) # N需要是整数
average_age = Y
# 模拟N年
for _ in range(N):
average_age = calculate_next_year(average_age, x)
# 向上取整并输出
print(math.ceil(average_age))
except EOFError:
break
算法及复杂度
- 算法:数学模拟
- 时间复杂度:
-
为需要模拟的年数
- 空间复杂度:
- 只需要常数额外空间