首页 > 试题广场 >

平均年龄

[编程题]平均年龄
  • 热度指数:31451 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
已知某公司总人数为 W ,平均年龄为 Y 岁(每年 3 月末计算,同时每年 3 月初入职新人),假设每年离职率为 x , x > 0 && x < 1 ,每年保持所有员工总数不变进行招聘,新员工平均年龄 21 岁。
从今年 3 月末开始,请实现一个算法,可以计算出第 N 年后公司员工的平均年龄。(最后结果向上取整)。
数据范围:

输入描述:
输入W Y x N


输出描述:
输出第N年后的平均年龄
示例1

输入

5 5 0.2 3

输出

15
推荐
#include <iostream>
#include <cmath>

using namespace std;
void AverageAge()
{
    // 总人数为W,平均年龄为Y岁
    // 每年离职率为x,x>0&&x<1
    double W, Y, x, N;

    while(cin >> W >> Y >> x >> N)
    {
        while(N--)
        {
            Y = 21 * x + (1 - x) * (Y + 1);
        }

        cout << ceil(Y) << endl;
    }
}

int main()
{
    AverageAge();
    return 0;
}

编辑于 2016-04-06 10:50:52 回复(20)
W个人的总年龄是WY,每年有(1-x)W的人还在,要招xW人才能保证总人数不变。由于第二年老员工集体增长1岁,所以第二年贡献的年龄为(Y+1)*(1-x)*W,新员工贡献的年龄为21*x*W,平均年龄为(Y+1)*(1-x)*W+21*x,成为了新一年的Y,于是得到迭代公式:Y=(Y+1)*(1-x)*W+21*x
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null){
            String[] params = line.split(" ");
            int w = Integer.parseInt(params[0]);
            double y = Double.parseDouble(params[1]);
            double x = Double.parseDouble(params[2]);
            int n = Integer.parseInt(params[3]);
            for(int i = 0; i < n; i++){
                y = (y + 1)*(1 - x) + 21*x;
            }
            System.out.println((int)Math.ceil(y));
        }
    }
}

发表于 2021-12-23 16:29:56 回复(0)

java的代码,哪位大神帮我瞅瞅,Eclipse中是对的,牛客里结果输出不出来
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int W=scanner.nextInt();
int Y_init=scanner.nextInt();
float Y_after=Y_init;
float x=scanner.nextFloat();
int N=scanner.nextInt();
scanner.close();
Y_after=Y_after-1;
while(N>0){
Y_after=(Y_after+1)(1-x)+x21;//老员工的年龄要加1
N--;
}
System.out.println((int)Math.ceil(Y_after));
}
}

发表于 2017-06-26 09:09:52 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        
        Main  M = new Main();
        Scanner sc = new Scanner(System.in);
do{
            int W = sc.nextInt();
            double Y = sc.nextDouble();
            double x = sc.nextDouble();
            int N = sc.nextInt();
            System.out.println(ageA(W,Y,x,N));
        }while(sc.hasNext());
    }
    
    public static int ageA(int X,double Y,double x,int N){
        double age = Y;//每年的平均年龄
        if(N == 0){
            return (int) Math.ceil(age);
        }
        for(int i = 1;i <= N ; i++){
            //每年的新增人平均年龄 + 离职后剩下员工(年龄要加1)的平均年龄
            age = (21*(X*x) + (age+1)*X*(1-x))/X;
        }
        return (int) Math.ceil(age);
    }
}
发表于 2017-06-08 18:15:00 回复(0)
员工平均年龄是Y,但后面离职的员工年龄可以不是Y,题目是按离职员工年龄为Y来计算的,所以我认为题目有问题,用【5 5 0.2 3】例子,3年情况应该是这样的:
第一年:【5,5,5,5,21】
第二年:【6,6,6,22,21】
第三年:【7,7,23,22,21】
还有一点问题就是,离职人数=W * x,当计算为小数时,取大还是取小?
我觉得正确的解法:
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int W,Y,N;
        double x;
        int year[];
        while(in.hasNext()){
            W = in.nextInt();
            Y = in.nextInt();
            x = in.nextDouble();
            N = in.nextInt();
            year = new int[W];
            for (int i = 0; i < W; i++){
                year[i] = Y;
            }
            double leave = W * x;
            for (int i = 0; i < N; i++){
                for (int j = 0; j <= leave; j++){
                    remove(year);
                }
                for (int j = 0; j < leave; j++){
                    appand(year,21);
                }
                grow(year);
            }
            double sum = 0;
            for (int i = 0; i < W; i++){
                sum += year[i];
            }
            System.out.println((int)Math.ceil(sum / W));
        }
    }

    private static void remove(int[] A){
        for (int i = 0; i < A.length - 1; i++){
            A[i] = A[i+1];
        }
        A[A.length - 1] = 0;
    }

    private static void appand(int[] A, int value){
        for (int i = 0; i < A.length; i++){
            if (A[i] == 0){
                A[i] = value;
                return;
            }
        }
    }

    private static void grow(int[] A){
        for (int i = 0; i < A.length; i++){
            A[i] += 1;
        }
    }
}

发表于 2016-09-15 17:35:47 回复(0)
import java.util.Scanner;

public class Main {
	
	final static int ageNew = 21;
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int W = 0, N = 0;
		double x = 0, Y = 0;
		while (in.hasNextInt()) {
			W = in.nextInt();		//总人数
			Y = in.nextDouble();	//平均年龄
			x = in.nextDouble();	//离职率
			N = in.nextInt();		//年数
			for(int i = 0; i < N; i++){
				Y = avegNew(Y, W, x);
			}
			System.out.println((int)Math.ceil(Y));
		}
		in.close();
	}	
	
	public static double avegNew(double aveg ,int W, double x ){
		double oldNum = W*x;
		aveg = ((aveg+1) * (W - oldNum) + oldNum * ageNew)/W;
		return aveg;
	}
}
//向上取整包括每年离职的人数和最终的平均年龄,过程中的平均年龄不做向上取整
//没想到可以不用W。。。

编辑于 2016-08-25 00:23:00 回复(0)
import java.util.Scanner;

public class Main{
    //这个题着实让我弄了好一会,首先有三个误区,
    //第一个误区,每年在招纳新员工的同时,老员工的年龄是要增长的
    //第二个误区,为什么最后的公式与 W 无关。
    //第三个误区,是这个向上取整,题目给出的用例是5 5 0.2 3
    //然后我计算第一年的平均年龄是9,不用取整。
    //然后计算第二年的平均年龄是11.4,这时候我直接向上取整了,变成了12
    //所以下一年的平均年龄我误以为是12+1,导致我的计算结果不符合
    //其实题目是想让你把最后一年计算出来的年龄向上取整。
    //下面看一下代码
    public static int Average(int W ,double Y ,double x ,int N){
        //W表示公司总人数,Y表示当年平均年龄,x表示离职率,N表示多年以后
        for(int i = 0 ; i < N ; i++){
            //原始公式是这个Y = ((Y+1)*(W-W*x) + 21*(W*x))/W;
            //先求的离职之后还没有纳新时所有员工的总年龄,
            //记得Y+1,老员工也是要长大的
            //求得老员工的总年龄,然后加上纳新的员工的总年龄
            //最后除去公司的总人数,就是当年公司的平均年龄。
            //这个年龄是不进行向上取整的,而且我们发现这个公式是可以化简的
            //*************************************
            //下面是化简之后的公式,可以发现公式是与W没有关系的,
            //这就是为啥有的人纳闷为啥别人直接给出公式为啥与W无关,
            //但是自己又感觉最后公式肯定与W有关的原因了。
            //所以传参的时候可以不用传W。此处只是为了说明,
            Y = (Y+1)*(1-x)+21*x;
        }
        //最后对求得的结果进行向上取整。返回就OK了
        return (int) Math.ceil(Y);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        do{
            int W = sc.nextInt();
            double Y = sc.nextDouble();
            double x = sc.nextDouble();
            int N = sc.nextInt();
            System.out.println(Average(W,Y,x,N));
        }while(sc.hasNext());
    }
}

编辑于 2016-08-24 16:22:41 回复(8)
import java.util.Scanner;
public class Main{
        
    public static void main(String[] args) {
       Scanner in=new Scanner(System.in);
       int W,Y0,N;
       float x,Y1;
       while(in.hasNext()){
           W=in.nextInt();
           Y0=in.nextInt();
           x=in.nextFloat();
           N=in.nextInt();
           
           Y1=Y0;
           
           for(int i=0;i<N;i++){
               Y1=calAvgAgeFloat(W,Y1,x);
           }  
           Y0=(int)Y1;
           if(Y1>Y0)
               System.out.println(Y0+1);
           else
               System.out.println(Y0);
       }

    }
    public static float calAvgAgeFloat(int W,float Y,float x){
        float sumOfAge=(W*Y-W*x*Y)+W*(1-x)*1+21*W*x;        
        float avgOfAge=sumOfAge/W;
        return avgOfAge;
    }    
}
每过一年,老员工加一岁,同时,不要每次计算向上取整,把最后一次的结果向上取整
发表于 2016-08-20 15:09:22 回复(0)