对于一组数据array,平均分配成m组,要求每组的数量差不多。
思路:先对array数据进行排序,计算出可以分成n组。
然后将array数据分成n组已经排序好的数据集合。
将N组数据分正向赋值到M中,再反向赋值到M中,如此反复到结束。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace fenpei
{
public class Person
{
public Person(string Name, int Capability)
{
this._name = Name;
this._capability = Capability;
}
private string _name;
private int _capability;
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Capability
{
get { return _capability; }
set { _capability = value; }
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("NAME1", 201);
Person p2 = new Person("NAME2", 233);
Person p3 = new Person("NAME3", 189);
Person p4 = new Person("NAME4", 198);
Person p5 = new Person("NAME5", 164);
Person p6 = new Person("NAME6", 181);
Person p7 = new Person("NAME7", 212);
Person p8 = new Person("NAME8", 205);
Person p9 = new Person("NAME9", 192);
Person p10 = new Person("NAME10", 241);
Person p11 = new Person("NAME11", 136);
Person p12 = new Person("NAME12", 201);
Person p13 = new Person("NAME13", 142);
Person p14 = new Person("NAME14", 127);
Person p15 = new Person("NAME15", 189);
Person p16 = new Person("NAME16", 221);
List<Person> personList = new List<Person>();
personList.Add(p1);
personList.Add(p2);
personList.Add(p3);
personList.Add(p4);
personList.Add(p5);
personList.Add(p6);
personList.Add(p7);
personList.Add(p8);
personList.Add(p9);
personList.Add(p10);
personList.Add(p11);
personList.Add(p12);
personList.Add(p13);
personList.Add(p14);
personList.Add(p15);
// personList.Add(p16);
Sort(personList, 3);
Console.Read();
}
/// <summary>
/// 表示分组的作用
/// </summary>
/// <param name="personList">总人数列表</param>
/// <param name="GroupCount">分组数量</param>
static void Sort(List<Person> personList, int GroupCount)
{
if (GroupCount <= personList.Count)
{
//先排序
personList.Sort(Compare);
//可以取的次数
int QU = Convert.ToInt32(personList.Count / GroupCount) + 1;
List<List<Person>> pList = new List<List<Person>>();
//排序后的数量
List<List<Person>> sortList = new List<List<Person>>();
//分组排序后的数据
for (int j = 0; j < QU; j++)
{
List<Person> getPerson = new List<Person>();
for (int i = 0; i < GroupCount; i++)
{
int index = 0;
if (j == 0)
{
index = i + j;
}
else
{
index = (j) * GroupCount + i;
}
if (index < personList.Count)
{
getPerson.Add(personList[index]);
}
}
if (getPerson.Count > 0)
{
sortList.Add(getPerson);
}
}
//开始分配
for (int j = 0; j < GroupCount; j++)
{
List<Person> listPerson = new List<Person>();
bool sort = true;
for (int i = 0; i < sortList.Count; i++)
{
//正向分
if (sort)
{
if (j < sortList[i].Count)
{
listPerson.Add(sortList[i][j]);
}
sort = false;
}
else//反向分
{
if (GroupCount - (j + 1) < sortList[i].Count && GroupCount - (j + 1) >= 0)
{
listPerson.Add(sortList[i][GroupCount - (j + 1)]);
}
sort = true;
}
}
if (listPerson.Count > 0)
{
pList.Add(listPerson);
}
}
int m = 0;
foreach (List<Person> lp in pList)
{
m++;
Console.Write("当前第" + m.ToString() + "组\r\n");
int totalCa = 0;
foreach (Person pp in lp)
{
totalCa = totalCa + pp.Capability;
Console.Write("能力:" + pp.Capability + "名字:" + pp.Name + "\r\n");
}
Console.Write("总能力:" + totalCa.ToString() + "\r\n");
Console.Write("结束\r\n");
}
}
else
{
Console.Write("无法分组,分组数量大于总人数\r\n");
}
}
public static int Compare(Person oPerson, Person nPerson)
{
if (oPerson == null)
{
if (nPerson == null)
{
return 0;
}
else
{
return -1;
}
}
else
{
if (nPerson == null)
{
return 1;
}
else
{
if (oPerson.Capability > nPerson.Capability)
{
return 1;
}
else if (oPerson.Capability == nPerson.Capability)
{
return 0;
}
else
{
return -1;
}
}
}
}
}
}
分享到:
相关推荐
【C# 排程演示系统含源代码】是一款基于C#编程语言和.NET框架开发的应用程序,主要用于模拟和理解日常工作的调度。这个项目不仅提供了一个直观的用户界面,还深入探讨了排程算法,这些算法在操作系统中用于高效地...
在C#编程中,递归、动态规划和贪心算法是三种重要的问题解决策略,广泛应用于各种复杂的计算问题。下面将分别对这三个知识点进行详细解释。 1. **递归的排列与半数集问题** - **递归排列**:递归是一种函数自我...
在这个场景中,我们关注的是一个实现了k-means算法的C#源代码。C#是一种面向对象的编程语言,广泛用于构建Windows桌面应用、Web应用以及游戏开发等,而且在数据处理和科学计算领域也有一定的应用。 首先,我们要...
【C#学生学籍管理系统源代码】是一款专为初学者设计的学习项目,它利用Microsoft的Visual Studio 2008开发环境以及Access数据库技术来构建一个完整的管理学生的系统。这个项目不仅提供了实际的编程实践,同时也让...
【大学生综合测评系统 ASP C#代码】是一款基于ASP.NET技术和C#编程语言开发的应用程序,主要服务于高等教育机构,用于对学生进行全面、系统性的评价与考核。这个系统是作者在大学三年级进行课程设计时的作品,旨在...
此外,ORM(Object-Relational Mapping)框架如Entity Framework也可用于简化数据库操作,将数据库表映射为C#对象,实现代码的更高级抽象。 4. **窗体设计** Windows Forms是.NET Framework提供的一种用于创建桌面...
本文将详细讨论如何使用C#语言来实现K均值聚类算法,并探讨其原理、步骤以及实际应用。 一、K均值算法原理 K均值算法基于迭代过程,旨在最小化每个簇内成员与簇中心的距离平方和。算法流程如下: 1. 初始化:选择...
《C#在线考试系统全部代码详解》 在线考试系统,作为一种高效、便捷的教育评估工具,已经在现代教育领域中广泛应用。本压缩包提供的"C#在线考试系统"是开发者使用C#编程语言构建的一个完整的解决方案,它包含了从...
前端可能使用ASP.NET MVC或ASP.NET Core MVC技术,后端则使用C#编写服务端代码,与数据库交互可能采用Entity Framework等ORM(对象关系映射)工具。 学习和研究这个C#宾馆管理系统源码,可以帮助开发者提升在C#编程...
`Dictionary, TValue>`的工作原理基于哈希表,这使得它的查找、插入和删除操作通常可以在平均O(1)的时间复杂度内完成。其中,`TKey`表示键的类型,`TValue`表示值的类型。键必须是唯一的,而值可以重复。键和值之间...
C#代码示例可能如下: ```csharp class Point { public double[] Coordinates { get; set; } } class Cluster { public Point Centroid { get; set; } public List<Point> Points { get; set; } } class ...
在给定的压缩包文件中,你将找到一个完整的C#项目,包括源代码、使用说明书以及示例调用代码,这些都是学习和理解k-means算法在C#环境下的实现方式的重要资源。通过研究这些文件,你可以深入理解算法的实现细节,并...
在给定的代码中,SJF算法被用C#语言实现,主要包含了输入进程信息、选择下一个执行的进程以及计算相关时间参数等功能。 首先,`InPut`方法用于输入进程的相关数据。用户需要提供进程的个数,然后对于每个进程依次...
每个进程在进入就绪队列后,按照其到达的先后顺序被分配CPU。这个算法公平且易于实现,但在处理短进程时可能会导致长进程等待时间过长,即饥饿问题。 2. **最优响应比算法(Priority Scheduling)**: 优先级调度...
链表是一种动态数据结构,不像数组那样需要预先分配连续的内存空间。链表的每个节点包含数据和指向下一个节点的引用。C#中的LinkedList类提供了链表的相关操作。链表特别适合于频繁进行插入和删除操作的场景,因为...
3. 计算并分配红包金额,根据红包类型执行随机分配或平均分配。 4. 存储红包信息到数据库,包括红包状态(未领、已领)、领取人信息等。 5. 提供接口供前端查询红包状态和领取记录。 6. 实现安全性措施,如防止恶意...
平均每15行代码进行一次断言检查,可以有效预防运行时错误。 #### 四、测试与异常处理 **9. 白盒测试** 确保代码的每一行都能通过白盒测试,这有助于发现潜在的逻辑错误和覆盖不足。 **10. 异常管理** 仅抛出已...
K-means聚类算法是一个常见的选择,它能将像素分配给最近的聚类中心,从而减少颜色的多样性。 最后,你可以将统计结果可视化,创建一个颜色直方图,展示不同颜色在图像中的分布。这通常使用柱状图完成,横轴代表...
这个项目是基于C#编程语言实现的,它使用了一种名为“离散差分进化”的优化算法来调整游戏的RTP(Return to Player)率以及奖品分配策略。下面将详细探讨这些知识点。 首先,C#是一种广泛使用的面向对象的编程语言...
9. 报表和统计分析:系统可能还需要提供报表生成功能,展示学生的平均分、最高分、最低分、及格率等统计信息,帮助教师分析学生的学习情况。 综上所述,"学生成绩管理系统(C#+mysql)"结合了C#的编程能力和MySQL的...