首页 > 试题广场 >

艾泽拉斯大陆战争

[编程题]艾泽拉斯大陆战争
  • 热度指数:127 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

背景
神奇的艾泽拉斯大陆上面居住着三个原始部落,分别是兽族S,精灵族J和巫族W。
我们得知不同部落中的两名成员(a,b)在遇到后一定会发生战斗,且只有一个能存活下来。
艾泽拉斯大陆的最强生存规则设定为在两名成员(a,b)战斗后,存活下来的成员会变成未参与战斗部落中的成员c。
当艾泽拉斯大陆的部落统一起来后(即最终只有一个部落存活),艾泽拉斯大陆将会是和平与繁荣的。


题目
假如你将辅佐艾泽拉斯大陆的国王,同时假定能够知道三个部落的规模大小(总人数),
请帮国王确认部落间的战斗能否给国家带来和平与繁荣,并找出艾泽拉斯大陆统一所需要的最少战斗数


输入:三个整形数据,分别为三族的人数,范围 0-300
整形数据,表示兽族S的人数
整形数据,表示精灵J的人数
整形数据,表示巫族W的人数


输出
最小战斗次数


示例1

输入

1,1,1

输出

1

说明

3个部落各自只有1个人员,假定为a,b,c
比如a和b战斗,幸存者转入没有战斗的部落,变成2个c
总战斗次数1,即可实现大陆的和平繁荣

备注:

两种策略
1.如果最小的两个数,假设为a>=b且相差为偶数,则选择将a,b全部变为c,先将a,b转变为两数相等,把大数和c战斗,每次战斗会使二者差距-2,所以在原来(a-b)/2次战斗后实现相等,此时两数值为a-(a-b)/2,再把两种族都转为c,一共转化了a-(a-b)/2 + (a-b)/2 = a次
2.如果最小的两个数,假设为a>b且相差为奇数,则二者一奇一偶,则有一个数,不妨设a和c奇偶性一样,做变换使二者相等,每次差距-2,做(c-a)/2次,此时c种族为c - (c-a)/2,将其都转为b种族,则次数为(c-a)/2 + c - (c-a)/2 = c次
发表于 2025-08-05 17:21:05 回复(0)
不知算不算面向结果编程。
int calc_best_fight_num(int S_num, int J_num, int W_num) {
        // write code here
        int a[]={S_num, J_num, W_num};
        sort(a,a+3);
        if(a[0]==0&&a[1]==0)
        return 0;
        else if((a[0]&1)==(a[1]&1))
        return a[1];
        else
        return a[2];
    }


发表于 2025-08-03 17:03:57 回复(0)