编程求解该问题,并思考是否为最优解。

某公司公司有4个项目组,项目组A、B、C、D,项目组A现有10人,项目组B现有7人,项目组C组现有5人,项目组D现有4人,为了实现跨项目组协作,公司决定每月从人数最多的项目组中抽调3人出来,到其他剩下3组中,每组1人,这称之为一次调整优化(亦即经过第一次调整后,A组有7人,B组有8人,C组有6人,D组有5人)

那么请问,经过十年的优化调整后,各项目组各有几人?

 

[8, 5, 7, 6]
 

状态0: [7,8,6,5]

状态1: [8,5,7,6]

状态2: [5,6,8,7]

状态3: [6,7,5,8]

状态0: [7,8,6,5]

除去第一次优化达到状态0,四次优化为一个周期。

十年120次优化,(120-1)%4=3,就是状态3咯。

 

import java.util.Arrays;

public class TeamCount {
	public static void main(String[] arg) {

		int[] memberNumber = { 10, 7, 5, 4 };
		int[] temp = new int[memberNumber.length];
		int year = 10*12;
		while (year > 0) {
			temp = memberNumber.clone();
			// System.out.println(Arrays.toString(memberNumber));
			Arrays.sort(temp);
			// System.out.println(Arrays.toString(temp));

			for (int i = 0; i < memberNumber.length; i++) {
				// System.out.println(memberNumber[i]);
				if (memberNumber[i] == temp[0]) {
					// System.out.println("temp[0]="+temp[0]+":memberNumber[i]="+memberNumber[i]);
					memberNumber[i] = memberNumber[i] + 1;
					// System.out.println(memberNumber[i]);
				} else if (memberNumber[i] == temp[1]) {
					// System.out.println("temp[1]="+temp[1]+":memberNumber[i]="+memberNumber[1]);
					memberNumber[i] = memberNumber[i] + 1;
				} else if (memberNumber[i] == temp[2]) {
					// System.out.println("temp[2]="+temp[2]+":memberNumber[i]="+memberNumber[i]);
					memberNumber[i] = memberNumber[i] + 1;
				} else if (memberNumber[i] == temp[3]) {
					// System.out.println("temp[3]="+temp[3]+":memberNumber[i]="+memberNumber[i]);
					memberNumber[i] = memberNumber[i] - 3;
					// System.out.println("- 3:"+memberNumber[i]);
				}
				year--;
			}

		}
		System.out.println(Arrays.toString(memberNumber));

	}
}

输出:[5, 6, 8, 7]

public class TeamAdjustTest {
    public static void main(String[] args) {
        int[] teams = {10, 7, 5, 4};
        int month = 10 * 12;
        int len = teams.length;
        for (int i = 0; i < month; ++i) {
            //人数最多的队伍
            int maxTeam = 0;
            //人数最多的队伍所在索引
            int maxIndex = 0;
            for (int k = 0; k < len; ++k) {
                int t = teams[k];
                if (t > maxTeam) {
                    maxTeam = t;
                    maxIndex = k;
                }
            }

            for (int k = 0; k < len; ++k) {
                if (k == maxIndex) {
                    teams[k] -= 3;
                } else {
                    ++teams[k];
                }
            }
        }
        //[6, 7, 5, 8]
        System.err.println(Arrays.toString(teams));
    }
}