gpt4 book ai didi

c# - 在几天内平均分配元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:48 24 4
gpt4 key购买 nike

我需要在固定的天数内分发剩余的元素。例如假设我有 197 件商品,并有 75 天的时间来分发它们。如果我显示 2 个项目 75 天,那么我有 47 个项目未显示。我如何在 75 天内平均分配剩余的 47 件元素,这样我就会得到像 2,3,3,2,3,3,2,2,3... 这样的序列。即 3 均匀分布在整体展示。这是我目前所拥有的

const double num = (double)197/75;
double temp = num;
var list = new List<int>();
for (var t = 1; t <= days; t++)
{
var intPart = int.Parse(Math.Truncate(temp).ToString());

list.Add(intPart);

var remainder = num - intPart;

temp = num + remainder;
}

但我最终只显示了 187 个项目。我少了 10 个。

最佳答案

正如 AlexD 所指出的那样,在某些情况下原来的答案给出了次优的结果:

int numItems = 197;
int numDays = 75;
var list = new List<int>();
for (int t = 0; t < numDays; t++)
{
int numItemsInDay = ((t+1)*numItems+numDays/2)/numDays - (t*numItems+numDays/2)/numDays;
list.Add(numItemsInDay);
}

想法是每个项目都进入由 itemIndex*numDays/numItems 的舍入值定义的一天,您可以直接计算一天中的项目数,而无需跟踪之前的项目项目。


另一种方法。

要在 numDays 天内尽可能均匀地分布 numItems 个项目,您需要使用 floor(numItems/numDays) 个项目和带有 ceil(numItems/numDays) 个项目的天数,尽可能均匀地分布 the spans。所以这个问题可以通过递归地将天数减少到跨度数来解决。

static List<int> Spread(int numDays, int numItems)
{
List<int> result = new List<int>();
if (numDays <= 1)
{
if (numDays == 1)
result.Add(numItems);
return result;
}
int numItemsInDayLower = numItems/numDays;
int numItemsInDayHigher = numItemsInDayLower+1;
int numDaysHigher = numItems - numItemsInDayLower * numDays;
int numDaysLower = numDays-numDaysHigher;
int numSpansLower = numDaysLower > numDaysHigher ? numDaysHigher + 1 : numDaysLower;
int numSpansHigher = numDaysHigher > numDaysLower ? numDaysLower + 1 : numDaysHigher;
bool isStartingFromSpanLower = numDaysLower > numDaysHigher;
List<int> spanLehgthsLower = Spread(numSpansLower, numDaysLower);
List<int> spanLehgthsHigher = Spread(numSpansHigher, numDaysHigher);
for (int iSpan = 0; iSpan < spanLehgthsLower.Count + spanLehgthsHigher.Count; iSpan++)
{
if ((iSpan % 2 == 0) == isStartingFromSpanLower)
{
for (int i = 0; i < spanLehgthsLower[iSpan/2]; i++)
result.Add(numItemsInDayLower);
}
else
{
for (int i = 0; i < spanLehgthsHigher[iSpan/2]; i++)
result.Add(numItemsInDayHigher);
}
}
return result;
}

关于c# - 在几天内平均分配元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21920579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com