这个问题是在一家大型IT公司最近举行的编码竞赛中提出的。我只拿到了30%,所以我无法澄清这场比赛,我想有人可以引导我理解这个问题的逻辑。
你和你的朋友是克隆人军队的飞行员。你面对的是分离主义德罗德军的空中舰队。机器人飞机在保持长线的同时移动,因此它们的护盾相互作用,因此不可能在直线中间击落飞机。因此,你唯一的选择是继续在线的边缘击落飞机。
你和你的朋友决定用它来玩游戏。每个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
发布于 2014-09-12 06:51:04
您的解决方案适用于您所给出的示例,但它在例如三个机器人数组上失败,因为您没有平坦的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,但第三艘船没有匹配。)如果我坐下来看一看数学,我也许可以,但这看起来不像你在编程测试中所期望的方向!
https://stackoverflow.com/questions/25801143
复制相似问题