c# – 从他们位置的球员得分列表中找出最大可能总数

在给出球员名单的情况下,我如何找到最大可能的球队得分?

我维持一个社交幻想联盟(澳大利亚规则)网站,你可以在赛季开始时挑选18名球员,然后每周你选择一个由6名球员组成的球队,每个位置分配1名球员.您一周的得分是您选择的每个球员得分的总和.例如.如果每位球员得分为50,那么本周的球队得分将为300.

为了在本轮结束后分析您的团队,我想展示一些指标.第一个是每个职位的最高分,第二个是你本周的团队.

我可以找出每个位置中得分最高的分数(“球员得分列表”截图中的绿色突出显示).

foreach (var player in playerList.Where(p => p.Forward == playerList.Max(x => x.Forward) && p.Forward > 0)) { player.ForwardTopScore = true; }
foreach (var player in playerList.Where(p => p.TallForward == playerList.Max(x => x.TallForward) && p.TallForward > 0)) { player.TallForwardTopScore = true; }
foreach (var player in playerList.Where(p => p.Offensive == playerList.Max(x => x.Offensive) && p.Offensive > 0)) { player.OffensiveTopScore = true; }
foreach (var player in playerList.Where(p => p.Defensive == playerList.Max(x => x.Defensive) && p.Defensive> 0)) { player.DefensiveTopScore = true; }
foreach (var player in playerList.Where(p => p.OnBaller == playerList.Max(x => x.OnBaller) && p.OnBaller > 0)) { player.OnBallerTopScore = true; }
foreach (var player in playerList.Where(p => p.Ruck == playerList.Max(x => x.Ruck) && p.Ruck > 0)) { player.RuckTopScore = true; }

然而,弄清楚团队可能取得的最大可能得分比我想象的要困难得多.在那里,可以跨职位共享高分.此外 – 你可能选择的“最好的球队”可能并不意味着球员得分最高.

《c# – 从他们位置的球员得分列表中找出最大可能总数》

我为这个例子计算的最佳分数(即你可以在每个位置挑选的最佳6名球员)是288.通过将你在红​​色方框中突出显示的6个分数加起来你得到288.看看即使Josh Kennedy在“关闭”位置得到57分,你最好选择他在“FW”位置因为下一个最佳“FW”球员得分19(托比·格林)之间的差异为23.记住,你必须在回合开始之前将一名球员分配到1个位置,这样你每个球员只能得1分.

有什么建议?我如何编写一个循环/查询来提取玩家列表及其得分,以获得288的最佳团队得分?

只是为了获得更多信息,playerList是这样构建的,我稍后在一些获得统计数据的网络服务调用后添加实际分数(Kicks,Handballs等…)

List<PlayerScore> playerList = new List<PlayerScore>();

foreach (var t in teams)
{
    playerList.AddRange(t.TeamSelections.Where(x => x.DateInactive == null).OrderBy(x => x.PlayerName).Select(p => new PlayerScore
    {
        TeamId = p.TeamID,
        PlayerName = p.PlayerName,
        Club = p.Club,
        ClubAbbreviation = Helper.Stats.GetClubAbbreviation(p.Club),
        TeamLeagueId = p.Team.LeagueId,
        TeamSelection = p.TeamSelectionId
    }));
}

最佳答案 我不知道如何挑选球队的规则,但可能只有一名球员必须填补这六个角色中的每一个?

如果你没有太多的玩家(例如在上面的桌子上它可能会很好用),那么蛮力方法可以起作用.
然后,如果你有n个玩家,第一个有n个选择,第二个有n-1(因为你不能在两个不同的位置拥有相同的玩家),等等.这总共提供了nP6(falling factorial)种可能性.这是非常大的,n⁶的顺序.
如果你想实现这个,你可以快速而又脏,实现一个六深的循环(确保排除已经选择的玩家),检查分数,并跟踪最高的分数.

减少检查可能性的一种方法,我认为这是合理的:在位置X中仅从该位置的前6名选手中选择你的球员.直觉是这样的:如果我为其他位置选择(最佳或不是)5名球员,我不能选择所有六位最佳得分手来获得位置X!所以至少其中一个仍然可用.然后,我不能做比选择仍然离开的最好的人更好.所以我当然可以排除那些没有得分排名前六的位置的任何人.当有联系时可能会出现问题,在这种情况下,为了安全起见,请保留任何前6名职位的人.

这种方式(假设没有关系),你只需要搜索最多6个可能性(如果相同的玩家在不同的类别中获得前6名则更少).即使是大型列表,最初搜索前6名也是易于处理的.

可以使用LINQ完成任何或所有这些操作,但不一定非必要.

点赞