利用C#队列集合(Queue)写的一个算法

C#队列集合类在工作当中很少用到,昨天偶然听到同学工作时的一个需求(资源重新平均分配,但自己的资源不能分配给自己),我自己想了想,也查了查,感觉有必要用下队列Queue,这样实现起来比较简单些。

一下是实现的代码:

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
Dictionary<long, List<long>> map = new Dictionary<long, List<long>>();
List<long> list1 = new List<long>();
list1.Add(1L);
list1.Add(2L);
list1.Add(3L);
list1.Add(4L);
list1.Add(5L);
list1.Add(6L);
list1.Add(7L);
list1.Add(8L);
list1.Add(9L);
list1.Add(10L);
list1.Add(11L);
list1.Add(13L);

List<long> list2 = new List<long>();

list2.Add(11L);
list2.Add(12L);
list2.Add(13L);
list2.Add(14L);
list2.Add(15L);

List<long> list3 = new List<long>();
list3.Add(31L);
list3.Add(32L);
list3.Add(33L);
list3.Add(34L);
list3.Add(35L);
list3.Add(36L);
list3.Add(37L);
list3.Add(38L);
list3.Add(39L);

List<long> list4 = new List<long>();

list4.Add(41L);
list4.Add(42L);
list4.Add(43L);
list4.Add(44L);

List<long> list5 = new List<long>();

list4.Add(63L);
list4.Add(73L);
list4.Add(83L);
list4.Add(93L);
list4.Add(64L);
list4.Add(74L);
list4.Add(84L);
list4.Add(94L);

List<long> list6 = new List<long>();
List<long> list7 = new List<long>();
List<long> list8 = new List<long>();
List<long> list9 = new List<long>();

map.Add(1L, list1);
map.Add(3L, list3);
map.Add(2L, list2);
map.Add(4L, list4);
map.Add(5L, list5);
map.Add(6L, list6);
map.Add(7L, list7);
map.Add(8L, list8);

Queue<long> queue = new Queue<long>();
foreach (var item in map)
{
foreach (long val in item.Value)
{
queue.Enqueue(val);
}
}

//新建所有用户的集合,每个用户放置平分后的资源
Dictionary<long, List<long>> data = new Dictionary<long, List<long>>();
int avg = queue.Count / map.Count; //获取平均分配数
int remain = queue.Count % map.Count; //获取剩余数
while(queue.Count>0)
{
bool isBreak=true;
foreach (var item in map)
{
if (!data.ContainsKey(item.Key))
{
data.Add(item.Key, new List<long>());
}
if(item.Value.Contains(queue.Peek())||data[item.Key].Count>=avg)
continue;
else
{
isBreak=false;
data[item.Key].Add(queue.Dequeue());
}
}
if(isBreak)
break;
}
Random random = new Random();
for (int i = 0; i < remain; i++)
{
int rand = random.Next(data.Count);
data.ElementAt(rand).Value.Add(queue.Dequeue());
}
foreach (var dd in data)
{
Console.Write(dd.Key+":");
foreach (long d in dd.Value)
{
Console.Write(d+",");
}
Console.WriteLine();
}

stopwatch.Stop(); // 停止监视
Console.WriteLine("所用时间:" + stopwatch.ElapsedMilliseconds);
Console.Read();

自己的资源不能分给自己,首先要把所有资源平分,然后平分的时候看是不是自己的。已经分过的就不再分了。剩余的没分完的随机分给所有人。

时间: 2024-08-09 09:26:07

利用C#队列集合(Queue)写的一个算法的相关文章

利用html5的本地存储写的一个购物车

好久没有写博客园了,很多知识没有记录下来:可惜: 这几天在开发微信,也写了一个订餐平台的微网站,里面需要写一个购物车: 这里主要是把商品的部分信息以json格式保存在sessionstorage中,还有商店信息也是: 以json格式保存有什么好处呢,轻量级的传输,大概是这样吧!另外,如果我们把商品信息分开存储,就会导致有多条的sessionstorage项,那以后实现在两家商店同时购物的话,就不可能区分每家商店的商品了: 如果代码是自己写的,就有版权,这么说.对吧,是在软件工程师书上看到的: 不

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e

初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现

这一次,笔者使用了STL库中的优先级队列(Priority Queue)来完成Dijkstra算法中extract-min()语句(即从未选中的节点中选取一个距离原点s最小的点)的功能.由于优先级队列的插入.删除操作只需要logn的时间花费,因此降低了不少运行时间. 本文使用C++实现了这一基本算法.参考<算法导论>第24.3节. /**  * Dijkstra's Single Source Shortest Path Algorithm in C++  * Time Cost : O(Ml

关于“堆栈集合”、“队列集合”;SortedList、SortedList&lt;T&gt;;

1.堆栈集合(stack.stack<T>) 逻辑:先进后出(ufo)Last in First Out 2.队列集合(Queue.Queue<T>) 逻辑:先进先出(FIFO)First in First Out 3.其他集合

Stack集合 Queue队列集合 Hashtable哈希表

Stack集合 干草堆集合 栈集合 栈;stack,先进后出,一个一个赋值,一个一个取值,安装顺序来. 属性和方法 实例化 初始化 Stack st = new Stack(); 添加元素 1 个数 2 Console.WriteLine(st.Count); 3 只要使用一次pop方法,就会从最后一个元素开始排除 弹出 4 Console.WriteLine(st.Pop()); 5 Console.WriteLine(st.Count); 6 只想查看不弹出 7 Console.WriteL

多个写线程一个读线程的无锁队列实现

在之前的一篇博客中,写了一个在特殊情况下,也就是只有一个读线程和一个写线程的情况下,的无锁队列的实现.其中甚至都没有利用特殊的原子加减操作,只是普通的运算.这样做的原因是,即使是特殊的原子加减操作,也比普通的加减运算复杂度高很多.因此文中的实现方法可以达到很高的运行效率. 但是,有的情况下并不是只有一个读线程和一个写线程.越是一般化的实现,支持的情况越多,但是往往损失的性能也越多.作者看到过一个实现(http://www.oschina.net/code/snippet_732357_13465

请写一个算法,用于将list集合内重复元素剔除

package Homework; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Scanner;/** * list集合是否可以包含重复元素? * 如果可以,请写一个算法,用于将list集合内重复元素剔除. * @author 张致远 * */public class Homework2 { public static void main(String[]

利用闲暇之余写了一个股票信息发送到微信的软件

利用闲暇之余写了一个股票信息发送到微信的软件, 有做股票的程序员可以试一下. 如何 将通达信的预警股票发送到微信 有新方法了. 股讯二代 更加简便,更加稳定. 先看效果: 安装只要三步 : 1.配置账号 2.设置通达信预警 3.启动程序 安装视频(只需要三分钟): 安装指南 下载地址 原文地址:https://www.cnblogs.com/xiaoxuebiye/p/10400334.html

硬货 | 利用 Linux tap/tun 虚拟设备写一个 ICMP echo 程序

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 前面两篇文章已经介绍过 tap/tun 的原理和配置工具.这篇文章通过一个编程示例来深入了解 tap/tun 的程序结构. 01 准备工作 首先通过 modinfo tun 查看系统内核是否支持 tap/tun 设备驱动. [root@by ~]# modinfo tun filename: /lib/modu