这个问题是在一家大型IT公司最近举行的编码竞赛中提出的。我只得到30%所以我无法清除比赛,我认为有人可以指导我弄清楚这个问题的逻辑。
你和你的朋友是克隆军的飞行员。你正面对分离主义机器人军队的空中舰队。 Droid飞机在保持长线的同时移动,因此它们的盾牌相互作用使得无法击落线路中间的飞机。因此,您唯一的选择是继续在线的边缘拍摄平面。
你和你的朋友决定用它制作游戏。每个Droid平面都具有重要性级别IMP[i]
。由于Droid飞机不宣传它们的重要性,所以你们两个都必须遵循混合策略并击落第一架飞机或最后一架飞机,每架飞机50%
。如果只有一架飞机,转弯的射手肯定会将其击落。你们两个轮流击落敌机。你有第一个回合。您将击落的飞机的重要性水平的预期总和是多少?
您将获得两个输入:
input1 = N (1 < = N < = 1000)
是Droid飞机的数量
input2 = IMP (for 0 < = i < N , 1 < = IMP [i] < = 100)
是一个包含Droid平面重要性级别的数组
输出格式:
一个字符串,包含您预期的击落平面重要性等级总和,四舍五入到十进制后的正好3位数
我试过了
public static string ExpectedSum(int input1, int[] input2)
{
//Write code here
int droids = input1;
Double IMP = 0;
for (int i = 1; i <= droids; i++)
{
IMP += 0.5 * Convert.ToDouble(input2[i - 1]);
}
return string.Format("{0:0.000}", IMP);
//return Convert.ToString(IMP);
}
输入:2,{10,20}
输出:15.000
这是他们给出的解释:你有50%的机会击落第一架或第二架。然后,你的朋友将击落剩余的飞机。您预期的击落飞机重要性等级总和= 0.5 * 10 + 0.5 * 20 = 15
答案 0 :(得分:1)
您的解决方案适用于您提供的示例,但它失败了,例如一个三机器人阵列,因为你没有平坦1/2
机会击落每个机器人,而是{ 3/4, 1/2, 3/4 }
机会。
我相信以下内容给出了正确答案,但速度非常慢,所以其他任何人都可以随意查看更快的结果。
您将其称为Calculate(input2, 0, input1 - 1, true)
,然后按照您已经完成的方式对结果进行舍入。
static double Calculate(int[] imp, int first, int last, bool myTurn)
{
if (first == last)
{
return myTurn ? imp[first] : 0;
}
return
(
(Calculate(imp, first + 1, last, !myTurn) + (myTurn ? imp[first] : 0))
+
(Calculate(imp, first, last - 1, !myTurn) + (myTurn ? imp[last] : 0))
) / 2;
}
我的下一个方法是使用类似的代码来计算每艘船在某些大小的数组中的概率,然后从中尝试识别模式。
编辑:我已经看过你为不同数量的船只获得每艘船的概率,我看不到第一次检查时出现的任何模式。 (嗯,你获得第一艘船的几率似乎来自OEIS A001045,第二艘来自A113954,但第三艘没有匹配。)如果我坐下来看看在数学上我可能会,但这看起来不像你在编程测试中所期望的方向!