我正在尝试解决关于CodinGame的练习之一。我以为我写了一个正确的代码,但结果很奇怪。
一代星舰正朝着人类的新家园前进: 天空的边缘。这个系外行星距离我们还有几个光年 将持续几个世纪,并看到多代船员 为人类太阳系外出生,复制和死亡 扩张。您的目标是确定哪些预期寿命 最适合与至少200名定居者一起到达Sky's Edge,而 避免船舶过度拥挤。
这个旅程将持续Y年,有一个可变的起始组 人,在最大容量为C的星舰上。每个成员 探险将具有完全相同的预期寿命。
每年,这些修改都将按照给定的顺序进行:1 - 每个船员都会变老一年。 2 - 超过预期寿命的每名船员都将死亡。 3 - 每批10名船员 年龄在20岁到预期寿命一半的成员(四舍五入 婴儿出生,将一名0岁的人加入船员。 这些限制是包容性的。
如果人数超过船舶容量C,人口过剩 导致内战导致船舶毁坏。该 如果至少有200人到达Sky,探险被认为是成功的 旅行Y年后的边缘。
您的目标是提供最低和最高的预期寿命 为了成功进行探险。总有至少一个 有效的预期寿命。
经过一番思考后我写了这个布尔函数:
public static Boolean UpdateYear(int EXP)
{
for (int i=0; i<Y; i++)
{
// AGING
foreach (People person in Populace)
{
if (person.age != 10000)
person.age++;
}
// DEATH
foreach (People person in Populace)
{
if (person.age>=EXP)
{
person.age = 10000;
}
}
// BIRTH
int fertile = 0;
foreach (People person in Populace)
{
if ((person.age>=20)&&(person.age<=EXP/2))
fertile = fertile + person.number;
}
int babies = fertile/10;
People newBorn = new People(0, babies);
Populace.Add(newBorn);
new_people = 0;
foreach (People person in Populace)
if (person.age != 10000)
new_people = new_people + person.number;
total = new_people;
if (total>=C)
return false;
}
if (total>=200)
return true;
else
return false;
}
这种情况的正确答案是:&#34; true&#34;对于EXP(期望)62或63,对所有其他人都是假的。
当我尝试在Main中运行此函数一次时,它会给出正确的结果。
示例:
Console.Error.WriteLine(UpdateYear(61));
但是当我尝试运行它几次时,无论是通过复制线还是使用循环,它都没有给出正确的结果。
for (int j=60; j<65; j++)
Console.Error.WriteLine(UpdateYear(j));
我得到的结果是:
假 假 假 假 假
应该是: 假(60) 假(61) 真(62) 真(63) 假(64) 错(60)
答案 0 :(得分:0)
您已将所有内容设为静态,因此您的人员列表中只有一个实例,但您不会尝试在连续运行之间(在循环中)重置它
这意味着当您第二次绕过循环时,仍会记住您的第一个循环操作。
也许不要让事情变得静止,或者每次循环时将所有事情重置为初始状态
对于它的价值,我认为我已经以不同的方式建模,将(非静态)Ship作为(非静态)Person的容器,我会添加和删除人员/当他们出生/死亡时从船上等,每个人都会有一个表明他们年龄的int。每年我们都会计算可行的肥沃人群,根据/ 10规则添加新人,从列表中剔除过时的人员。