我有一个排名第一的球员,他们是按分数的顺序排列的。此外,还有一份名单的排名奖品的排名越来越高。每个球员在一定的时间点选择在领导板比赛。例如,
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-5是tied
如果奖金额之和不成平分,则舍入并计算因舍入而损失的变化之差。按选择时间的顺序在玩家之间均匀分配舍入误差。例如,Each extra penny would be allocated in order of opt-in time.:
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人)分出来。
发布于 2021-03-11 18:48:26
我想这就是你想要的:
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()将球员按分数分组。
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}");
}
}
}这里有几点要说。
,
如果球员太多,
break关键字).players数组在这里)https://stackoverflow.com/questions/66588326
复制相似问题