除以int以获得最佳结果

时间:2017-07-09 18:55:43

标签: c# formula

我内心深处有点挣扎。我正在尝试创建一个组创建者,它将根据其最终编号创建组。

除非参与者人数低于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);

希望得到帮助并提前致谢: - )

1 个答案:

答案 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"; 
   }
 }