C#ConcurrentQueue队列在分苹果中的简单应用
1、同事发来了小学生家庭作业。用编程来实现苹果的分配。
一共有N个苹果,M个篮子,最大程度的均分苹果
要求:
1:只能最后一个篮子出现奇数,其他篮子必须是偶数
2:最后一个篮子的苹果数量,不能与前一篮子相差超过2个
比如77个苹果,5个篮子:分配方案 16 16 16 14 15
比如350个苹果,18个篮子的分配方案是: 13个篮子放20个,5个篮子放 18个
2、经过考虑后,决定用队列来实现。出队的首元素自动加入队列尾部,实现循环队列的功能。同时,要实现如果有奇数一定放在最后,那就要所有元素的循环次数是相同的,把余数加在最后一位就可以了。
3、程序编码如下:
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp2 { class Program { internal class Basket { public int BasketId { get; set; } public int AppleCount { get; set; } public override string ToString() { return $"篮子{BasketId}:苹果{AppleCount}个;"; } } static void Main(string[] args) { Console.WriteLine("小朋友拿好篮子排好队,老师开始分苹果了...."); int basketNumber = 5; int appleNumber = 77; List<int> apples = Enumerable.Range(1, appleNumber / 2).Select(x => 2).ToList(); int number = apples.Count % basketNumber; Enumerable.Range(1, basketNumber-number-1).ToList().ForEach(p => { apples.Add(0); }); apples.Add(appleNumber % 2); List<Basket> baskets = new List<Basket>(); Enumerable.Range(1, basketNumber).ToList().ForEach(x => baskets.Add(new Basket() { BasketId = x, AppleCount = 0 })); ConcurrentQueue<Basket> queue = new ConcurrentQueue<Basket>(baskets); apples.ForEach(p => { queue.TryDequeue(out Basket x); x.AppleCount += p; queue.Enqueue(x); }); baskets = baskets.OrderBy(p => p.BasketId).ToList(); string result = string.Empty; baskets.ForEach(p => { result += p.ToString(); }); Console.WriteLine($"一共{appleNumber}个苹果,{basketNumber}个小朋友。\r\n分配结果如下:\r\n{result}"); Console.ReadKey(); } } }
4、程序运行结果如下:
小朋友拿好篮子排好队,老师开始分苹果了....
一共77个苹果,5个小朋友。
分配结果如下:
篮子1:苹果16个;篮子2:苹果16个;篮子3:苹果16个;篮子4:苹果14个;篮子5:苹果15个;

浙公网安备 33010602011771号