我内心深处有点挣扎。我正在尝试创建一个组创建者,它将根据其最终编号创建组。
除非参与者人数低于6,否则一组中的最高人数为4人,一组人数不得少于3人。
示例:
Participants: 5 = 1x3, 1x2
Participants: 7 = 1x4, 1x3
Participants: 8 = 2x4
Participants: 9 = 3x3
Participants: 10 = 1x4, 2x3
Participants: 18 = 3x4, 2x3
简而言之。 4最好,3秒最好,2如果有必要,1是不行。
如何在C#中创建一个获得此的公式?我的思绪在某种循环中转动,但我迷失了!
这是我现在正在做的事,但我不知道如何到达那里。我知道这都错了。
int participants = 10;
int g1 = 4;
while (participants > 0) {
g1 = participants;
participants -= 4;
}
print ("GROUP: " + g1);
希望得到帮助并提前致谢: - )
答案 0 :(得分:1)
如果数字n
足够(例如,10
或更多),您可以尝试以下方案:
number scheme
------------------------------------------
n = 4k -> 4k
n = 4k + 1 -> 4(k - 2) + 3*3
n = 4k + 2 -> 4(k - 1) + 3*2
n = 4k + 3 -> 4(k - 0) + 3*1
例如在给出时
n = 2017
我们有
n / 4 == 504
n % 4 == 1 // 4k + 1 case where k = 504
解决方案是
n = 4*502 + 3*3
因此,如果数字n
很大,那么当所有其他人都是最佳群组时,您可以保证最多只有3
秒。对于小n
s [2..9]
,只需构建最佳解决方案的字典。
可能的C#代码:
static Dictionary<int, string> s_LowNs = new Dictionary<int, string>() {
{2, "1x2"},
{3, "1x3"},
...
{9, "3x3"},
};
private static string Solve(int value) {
if (value <= 1)
throw new ArgumentOutOfRange("value");
string result;
if (s_LowNs.TryGetValue(value, out result))
return $"Participants: {value} = {result}";
else {
int k = value / 4;
int c = value % 4;
if (c == 0)
return $"Participants: {value} = {k}x4";
else if (c == 1)
return $"Participants: {value} = {k - 2}x4 3x3";
else if (c == 2)
return $"Participants: {value} = {k - 1}x4 2x3";
else
return $"Participants: {value} = {k}x4 1x3";
}
}