请教一个使用c#平均分水果的程序或思路

.Net技术 码拜 10年前 (2015-05-11) 1009次浏览 0个评论
 

请教一个使用c#平均分水果的程序或者思路
程序同时满足下面的情景
情景1:
假如有3个人A、B、C, A手里有0个,B手里有0个,C手里有0个水果
假设要分5个水果给这三个人,确保每个人手里的水果尽量平均,最后分完后A手里有2个,B手里有2个,C手里有1个
情景2:
假如有3个人A、B、C, A手里有1个,B手里有3个,C手里有0个水果
假设要分1个水果给这三个人,确保每个人手里的水果尽量平均,最后分完后A手里有1个,B手里有3个,C手里有1个

非常感谢!

public class Person
        {
            public int AppleCount { get; set; }
        }

        static void AllotApple(List<Person> persons, int totalApples)
        {
            while (totalApples > 0)
            {
                var person = persons.OrderBy(x => x.AppleCount).First();
                person.AppleCount++;
                totalApples--;
            }
            persons.ForEach(x =>
            {
                Console.WriteLine(x.AppleCount);
            });
        }

调用方法

List<Person> persons = new List<Person>() { new Person() { AppleCount = 1 }, new Person() { AppleCount = 5 }, new Person() };
            AllotApple(persons, 20);
大致上要满足
情景1对应的输入参数为(fruitdistributecount:5,peoplecount:3,fruitorgcount:0,0,0) 输出结果为2,2,1 
情景2对应的输入参数为(fruitdistributecount:1,peoplecount:3,fruitorgcount:1,3,0) 输出结果为0,0,1 
20分
public class Person
        {
            public int AppleNow { get; set; }
            public int AppleAdd { get; set; }
        }

        static void AllotApple(List<Person> persons, int totalApples)
        {
            while (totalApples > 0)
            {
                var person = persons.OrderBy(x => x.AppleNow + x.AppleAdd).First();
                person.AppleAdd++;
                totalApples--;
            }
            persons.ForEach(x =>
            {
                Console.WriteLine(x.AppleAdd);//这就是你要的分配数据
                Console.WriteLine(x.AppleAdd + x.AppleNow);//这是最终分配时每个人的苹果总数量
                Console.WriteLine("##################");
            });
        }

都这样子了还不会改下代码啊……

List<Person> persons = new List<Person>() { new Person() { AppleNow = 1 }, new Person() { AppleNow = 5 }, new Person() };
            AllotApple(persons, 20);
非常感谢,我第一次回复的时候还没有看到你的答案
static void AllotApple(List<Person> persons, int totalApples)
        {
            if (persons.Count < 2)
            {
                throw new Exception("如果要分配,那人数至少要二人");
            }
            while (totalApples > 0)
            {
                var tmpPersons = persons.OrderBy(x => x.AppleNow + x.AppleAdd).Take(2).ToList();
                var addApples = Math.Min(totalApples, tmpPersons[1].AppleAdd + tmpPersons[1].AppleNow - tmpPersons[0].AppleAdd - tmpPersons[0].AppleNow);
                if (addApples == 0)
                {
                    addApples = 1;
                }
                tmpPersons[0].AppleAdd += addApples;
                totalApples -= addApples;
                Console.WriteLine("分配数量:" + addApples);
            }
            persons.ForEach(x =>
            {
                Console.WriteLine(x.AppleAdd);//这就是你要的分配数据
                Console.WriteLine(x.AppleAdd + x.AppleNow);//这是最终分配时每个人的苹果总数量
                Console.WriteLine("##################");
            });
        }

再写个改善代码,可以减少分配次数

学习中……

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教一个使用c#平均分水果的程序或思路
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!