c# - 在整个比赛中获得两支球队最大的领先优势
问题描述
我有一个Game
涉及 2 个团队的项目。有Game
一个列表ScoreEvents
。每个 ScoreEvent 是得分球队的 1 分。我需要知道每支球队的最大领先得分是多少(如果他们从未领先,则为 0)。ScoreEvents
列表按TimeSinceStart
排序。
public class ScoreEvent
{
public int TeamId { get; set; }
public TimeSpan TimeSinceStart { get; set; }
}
public void GetMaxScoreLead()
{
var ScoreEvents = new List<ScoreEvent>
{
new ScoreEvent { TeamId = 0, TimeSinceStart = new TimeSpan(100)},
new ScoreEvent { TeamId = 0, TimeSinceStart = new TimeSpan(200)},
new ScoreEvent { TeamId = 0, TimeSinceStart = new TimeSpan(300)},
//Score at 300 ticks is 3-0 to TeamdId = 0
new ScoreEvent { TeamId = 1, TimeSinceStart = new TimeSpan(400)},
new ScoreEvent { TeamId = 1, TimeSinceStart = new TimeSpan(500)},
new ScoreEvent { TeamId = 1, TimeSinceStart = new TimeSpan(600)},
new ScoreEvent { TeamId = 1, TimeSinceStart = new TimeSpan(700)},
//Score at 700 ticks is a 3-4 to TeamId = 1
new ScoreEvent { TeamId = 0, TimeSinceStart = new TimeSpan(800)},
new ScoreEvent { TeamId = 0, TimeSinceStart = new TimeSpan(900)},
new ScoreEvent { TeamId = 0, TimeSinceStart = new TimeSpan(1000)},
new ScoreEvent { TeamId = 0, TimeSinceStart = new TimeSpan(1100)}
//Score at 1100 ticks is 7-4 to TeamId 0
};
}
因此,对于上面的示例,每个团队最大领先的答案是:
- TeamId (0) = 3 最大领先
- TeamId (1) = 1 最大领先
编辑:我必须的代码。我知道我需要在某处跟踪当前分数。
var teamZeroLargestLead = 0;
var teamOneLargestLead = 0;
var internalTeamZeroLargestLead = 0;
var internalTeamOneLargestLead = 0;
foreach (var scoreEvent in scoreEvents.OrderBy(x => x.TimeSinceStart))
{
if (scoreEvent.TeamId == 0)
{
if (internalTeamOneLargestLead > teamOneLargestLead)
{
teamOneLargestLead = internalTeamOneLargestLead;
internalTeamOneLargestLead = 0;
}
internalTeamZeroLargestLead += 1;
}
else
{
if(internalTeamZeroLargestLead > teamZeroLargestLead)
{
teamZeroLargestLead = internalTeamZeroLargestLead;
internalTeamZeroLargestLead = 0;
}
internalTeamOneLargestLead += 1;
}
}
解决方案
var leftTeamId = ScoreEvents.First().TeamId
var res = ScoreEvents
.OrderBy(x => x.TimeSinceStart)
.Aggregate(
(max: 0, min: 0, curr: 0),
(acc, currSE) => {
var curr = currSE.TeamId == leftTeamId
? acc.curr +1
: acc.curr - 1;
if(curr > acc.max)
{
return (curr, acc.min, curr);
}
else if (curr < acc.min)
{
return (acc.max, curr, curr);
}
return (acc.max, acc.min, curr);
});
对于带有 id 的“左”团队,leftTeamId
您使用res.max
的“右”团队Math.Abs(res.min)
:
- TeamId (0) =
res.max
最大领先 - TeamId (1) =
Math.Abs(res.min)
最大领先
我没有得到正确的TeamId,因为理论上只有一支球队可以得分(但假设至少有一支球队得分=)。
推荐阅读
- java - Spring MVC Hibernate 集成问题
- python-2.7 - 在重复标签中查找文本
- c++ - Boost program_options 路径中的斜杠和空格无法正确解析
- vbscript - 如何计算确定日期的工作日数?
- schema.org - Schema.org 用于多个产品依赖项或先决条件
- css - 导航栏未显示在网站的第二页上
- c++ - 为什么 `wifstream` 上的 `getline` 从 UTF-16 编码文件中读取乱码输入?
- windows - 如何让 Windows 让我安装未签名的应用程序?
- php - 正则表达式仅保留字符串中的最后一个点
- python-3.x - wxpython 不能选择好的面板进行缩放