[英]Evenly distribute collection into new Arrays
我正在嘗試創建一種將數組平均分配到X個新數組中的方法,其中僅允許15個項目pr數組,並且如果前一個數組有10個項目,則只允許創建一個新數組,除非陣列中的項目少於10個。
編輯
使我的問題對將來的讀者更易理解。
您需要多少名員工,以及您如何分擔他們的工作量?
結束編輯
Max allowed number in array = 15;
Min allowed number in array = 10;
Number = Numbers of Items in the Collection.
Number 5 => [5]
Number 13 => [13]
Number 16 => [10] [6]
Number 29 => [15] [14]
Number 30 => [15] [15]
Number 31 => [11] [10] [10]
Number 32 => [12] [10] [10]
Number 33 => [11] [11] [11]
我正在嘗試用C#解決這個問題。
到目前為止,這是我的代碼,但是在16 = [16],29 = [19] [10],38 = [18] [10] [10]等數字時失敗
const int maxAllowedOrderLines = 15;
const int minAllowedOrderLines = 10;
var optimalOrderDisp = new List<int>();
Console.WriteLine("Number of OrderLines");
int linjer = Convert.ToInt32(Console.ReadLine());
if (linjer <= maxAllowedOrderLines)
optimalOrderDisp.Add(linjer);
else
{
for (var i = maxAllowedOrderLines; i > 0; i--)
{
var maxOrderLines = linjer%i;
if (maxOrderLines == 0 || i <= minAllowedOrderLines || linjer < maxAllowedOrderLines)
{
Console.WriteLine("Optimal number of order lines {0}--{1}", i, (double) linjer/(double) i);
var optimalNumberOfOrders = linjer/i;
for (var orderNumber = 0; orderNumber < optimalNumberOfOrders; orderNumber++)
{
optimalOrderDisp.Add(i);
}
if (maxOrderLines != 0)
optimalOrderDisp[0] += maxOrderLines;
break;
}
}
}
foreach (var i1 in optimalOrderDisp)
{
Console.Write("[{0}]", i1);
}
Console.WriteLine();
嗯...
const double bucketSize = 15.0;
var totalItems = (double)linjer;
var optimumBuckets = Math.Ceiling(totalItems / bucketSize);
var itemsPerBucket = (int)Math.Ceiling(totalItems / optimumBuckets);
var buckets = new int[(int)optimumBuckets];
var itemsLeft = (int)totalItems
for (var i = 0; i < buckets.length; i++)
{
if (itemsLeft < itemsPerBucket)
{
buckets[i] = itemsLeft;
}
else
{
buckets[i] = itemsPerBucket;
}
itemsLeft -= itemsPerBucket;
}
似乎可以滿足您的要求。
好玩的問題。 我試了一下:
const int maxAllowedOrderLines = 15;
const int minAllowedOrderLines = 10;
static List<int> optimalOrderDisp = new List<int>();
static void Main(string[] args)
{
int Lines = Convert.ToInt32(Console.ReadLine());
int MinNumberOfBuckets = (int) Math.Ceiling((double) Lines / minAllowedOrderLines);
int RemainingLines = Lines;
int BucketLines = Lines / MinNumberOfBuckets;
// Distribute evenly
for (int i = 0; i < MinNumberOfBuckets; i++)
{
optimalOrderDisp.Add(i != MinNumberOfBuckets - 1 ? BucketLines : RemainingLines);
RemainingLines -= BucketLines;
}
// Try to remove first bucket
while (RemoveBucket())
{
}
// Re-balance
Lines = optimalOrderDisp.Sum();
RemainingLines = Lines;
BucketLines = (int) Math.Round((double) Lines / (optimalOrderDisp.Count));
for (int i = 0; i < optimalOrderDisp.Count; i++)
{
optimalOrderDisp[i] = (i != optimalOrderDisp.Count - 1 ? BucketLines : RemainingLines);
RemainingLines -= BucketLines;
}
// Re-balance to comply to min size
for (int i = 0; i < optimalOrderDisp.Count - 1; i++)
if (optimalOrderDisp[i] < minAllowedOrderLines)
{
int delta = minAllowedOrderLines - optimalOrderDisp[i];
optimalOrderDisp[i] += delta;
optimalOrderDisp[optimalOrderDisp.Count - 1] -= delta;
}
Console.WriteLine(String.Join("\n", optimalOrderDisp.ToArray()));
}
static bool RemoveBucket()
{
if (optimalOrderDisp.Sum() > maxAllowedOrderLines * (optimalOrderDisp.Count - 1))
return false;
int Lines = optimalOrderDisp[0];
int RemainingLines = Lines;
int BucketLines = Lines / (optimalOrderDisp.Count - 1);
// Remove bucket and re-distribute content evenly
// Distribute evenly
for (int i = 1; i < optimalOrderDisp.Count; i++)
{
optimalOrderDisp[i] += (i != optimalOrderDisp.Count - 1 ? BucketLines : RemainingLines);
RemainingLines -= BucketLines;
}
optimalOrderDisp.RemoveAt(0);
return true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.