首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何把钱四舍五入,然后再把剩下的一分钱分配给排名靠前的玩家?

如何把钱四舍五入,然后再把剩下的一分钱分配给排名靠前的玩家?
EN

Stack Overflow用户
提问于 2021-03-11 18:23:40
回答 1查看 96关注 0票数 1

我有一个排名第一的球员,他们是按分数的顺序排列的。此外,还有一份名单的排名奖品的排名越来越高。每个球员在一定的时间点选择在领导板比赛。例如,

代码语言:javascript
复制
RankedPlayers                    RankPrizes
-------------                    ----------
Player-3 (Points = 500)          Rank-1 Prize ($500.00)
Player-4 (Points = 400)          Rank-2 Prize ($300.00)
Player-2 (Points = 200)          Rank-3 Prize ($250.01)
Player-1 (Points = 200)
Player-5 (Points = 200)

当一个以上的球员被打成平手,他们将分享相同的排名,下一个x级将被跳过。所有从平局到最后跳过的奖品将被相加,并在平手之间分配。例如,在上面的例子中,Player-2, Player-1, Player-5tied

如果奖金额之和不成平分,则舍入并计算因舍入而损失的变化之差。按选择时间的顺序在玩家之间均匀分配舍入误差。例如,Each extra penny would be allocated in order of opt-in time.

代码语言:javascript
复制
Player-2, Player-1, Player-5 are TIED with total prize money to be shared $250.01
They opted in the leaderboard in order of: Player-1, Player-5, Player-2 
So their split of $250.01 should be:
Player-1: $83.34
Player-5: $83.34
Player-2: $83.33

我该如何把钱分给球员?即使分开,我也可以很容易地把每个玩家的总数(=总数/n人)分出来。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-11 18:48:26

我想这就是你想要的:

代码语言:javascript
复制
Winning Players:
  Points Players
     500 Player-3
     400 Player-4
     200 Player-1,Player-2,Player-5
     100 Player-6

Current Status:
Player       Points   Money
Player-1     200      $83.34
Player-2     200      $83.33
Player-3     500      $500.00
Player-4     400      $300.00
Player-5     200      $83.34
Player-6     100      $0.00

下面的代码。我用GroupBy()将球员按分数分组。

代码语言:javascript
复制
public class Player
{
    public Player(string name, int points)
    {
        Name=name;
        Points=points;
        Money = 0m;
    }

    public string Name { get; set; }
    public int Points { get; set; }
    public decimal Money { get; set; }
}

public class Prize
{
    public Prize(int rank, decimal value)
    {
        Rank=rank;
        Value=value;
    }

    public int Rank { get; set; }
    public decimal Value { get; set; }
}

static class Program
{
    static void Main(string[] args)
    {
        var players = new Player[] {
            new Player(2, "Player-1", 200),
            new Player(5, "Player-2", 200),
            new Player(4, "Player-3", 500),
            new Player(1, "Player-4", 400),
            new Player(3, "Player-5", 200),
            new Player(6, "Player-6", 100),
        };

        var prizes = new Prize[] {
            new Prize(1, 500m),
            new Prize(2, 300m),
            new Prize(3, 250.01m),
        };

       
        // In ranked order just in case of bad data
        Array.Sort(prizes, (x, y) => x.Rank.CompareTo(y.Rank));

        Console.WriteLine("Winning Players:");
        Console.WriteLine($"{"Points",8} {"Players"}");
        int index = 0;
        foreach (var group in players.GroupBy((item) => item.Points).OrderByDescending(g=>g.FirstOrDefault().Points))
        {
            Console.WriteLine($"{group.Key,8} {string.Join(",", group.Select((g) => g.Name))}");
            if (index<prizes.Length)
            {
                var prize = prizes[index].Value;
                var amount = Math.Ceiling( prize/group.Count()*100)/100;
                var sum = 0m;
                foreach (var player in group.OrderBy( (p)=>p.Order) )
                {
                    var actual = Math.Min(amount, prize-sum);
                    sum += actual;
                    player.Money += actual;
                }
            }
            else
            {
                break;
            }
            index++;
        }
        Console.WriteLine();
        Console.WriteLine("Current Status:");
        Console.WriteLine($"{"Player",-12} {"Points",-8} {"Money",-8}");
        foreach (var player in players)
        {
            Console.WriteLine($"{player.Name,-12} {player.Points,-8} {player.Money,-8:c}");
        }
    }
}

这里有几点要说。

  1. ,如果没有足够的球员参加所有的奖品,会发生什么?这个问题还没有明确解决,但默认情况是将钱留在表上。

如果球员太多,

  1. 会发生什么?上面的代码停止出钱循环(请参阅break关键字).

  1. 保存给出的钱的记录,并修剪排序中最后的球员,以确保分文正确分发。--

  1. 按奖品在排行榜中的顺序对玩家进行排序(players数组在这里)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66588326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档