- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题:农场里有很多动物。每个动物都可以有任意数量的动物 friend ,反社会动物除外——它们没有属于它们的 friend ,但它们属于其他正常动物的 friend 。每只动物都和它最不快乐的动物 friend 一样快乐,当然,反社会动物除外。反社会动物的幸福水平可以是任何东西。
一天早上,所有的动物都醒来,发现一些反社会动物的情绪发生了变化。农民如何计算出每只动物的幸福度?
这是牧场 worker 的情况(他们没有上过农民学校):
DataTable animals = Select_All_Animals();
foreach (DataRow animal in animals.Rows)
{
int worstMood = 10; //Super Happy!
DataTable friendRecords = Select_Comp_Animal_AnimalFriend((int)animal["AnimalID"]);
foreach (DataRow friend in friendRecords.Rows)
{
DataTable animalFriends = Select_AnimalFriend((int)friend["AnimalID_Friend"]);
foreach (DataRow animalFriend in animalFriends.Rows)
{
int animalMood = Get_Animal_Mood((int)animalFriend["Mood"]);
if (animalMood < worstMood)
{
worstMood = animalMood;
}
}
}
}
但这行不通,因为动物表并不按顺序遵循已形成的动物 friend 层次结构。动物可以随时交 friend !所以 Animal(1) 可能有 Animal(4000) 作为 friend 。 Animal(1) 不会显示准确的心情,因为它会在 Animal(4000) 的心情更新之前检查 Animal(4000) 的心情。每天都有新动物掉落。我认为解决方案可能是一种常见的算法设计,但我一直没能找到它。我不相信我有正确的术语来准确地搜索它。
非常感谢,如果这个问题已经得到解答,我们深表歉意!
添加:
这是可能关系的 ghetto Paint 图表:
反社会动物处于底层,没有属于他们的 friend 。正常的动物在上面的其他地方。正常的动物友谊没有确切的结构,除了(正如塞巴斯蒂安指出的那样)不能有一个闭环(如果设计正确)。
每周将添加数十万只动物,处理速度是一个关键因素。
最佳答案
首先抓取所有反社会动物,并按照从最不快乐到最快乐的顺序排列它们。将所有群居动物的幸福度初始化为最大(这使一切变得更容易,因为您不必检测以前不快乐的动物何时变得更快乐)。然后遍历列表并将幸福水平传播到友谊链上:
void UpdateFarm()
{
// Start with a list of antisocial animals from least to most happy.
var antisocialAnimals = GetAntisocialAnimals().OrderBy(x => x.Happiness);
// Initialise the social animals to the global maximum. Note the
// global maximum is the happiest antisocial animal. This is done to
// avoid the case where an antisocial animal's happiness has increased,
// so some of the social animals are too unhappy.
var maxHappiness = antisocialAnimals.Last().Happiness;
var socialAnimals = GetSocialAnimals();
foreach (var socialAnimal in socialAnimals)
socialAnimal.Happiness = maxHappiness;
// Now iterate from least to most happy, propagating up the friend chain.
foreach (var antisocialAnimal in antisocialAnimals)
UpdateFriends(antisocialAnimal);
}
// To propagate a happiness change, we just find all friends with a higher
// happiness and then lower them, then find their friends and so on.
void UpdateFriends(Animal animal)
{
var friends = GetFriends(animal); // Friends with this animal, not friends of.
foreach (var friend in friends.Where(x => x.Happiness > animal.Happiness))
{
friend.Happiness = animal.Happiness;
// Since this friend's happiness has changed, we now need to update
// its friends too.
UpdateFriends(friend);
}
}
关于c# - Farmer 需要循环遍历自引用动物表的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14151289/
问题:农场里有很多动物。每个动物都可以有任意数量的动物 friend ,反社会动物除外——它们没有属于它们的 friend ,但它们属于其他正常动物的 friend 。每只动物都和它最不快乐的动物 f
我对 Farmer 感兴趣并决定在我的项目中尝试一下。我设法用 Farmer 替换了大部分 ARM 模板。 但是,还剩下 Application Insights,因为我在那里进行了相当复杂的设置,包
Farmer 库具有用于创建虚拟机的构建器,尽管它支持参数“diagnostics_support_external”,该参数支持使用现有创建的存储帐户进行启动诊断。 let storageAccou
这个问题来自在线竞赛网站codechef。它需要计算素数。问题是: Farmer Feb has three fields with potatoes planted in them. He harv
我正在寻找可以用\"替换字符串中每个引号的东西。 我试过这个: local te = 'Press "start" to begin!' te = string.gsub(te,'"','\") pr
我是一名优秀的程序员,十分优秀!