04. MOBA Challenger
https://pastebin.com/zV6Yjr5d ----- Решението ми!
https://judge.softuni.bg/Contests/Practice/Index/997#1 ----- Условие
Някой може ли да ми кажe защо не ми минават последните 2 теста
https://pastebin.com/zV6Yjr5d ----- Решението ми!
https://judge.softuni.bg/Contests/Practice/Index/997#1 ----- Условие
Някой може ли да ми кажe защо не ми минават последните 2 теста
Виж в условието там където сравняваш двата плейъра, трябва да им сравняваш общо всичките скилове а не само в текущата позиция. Трябва да изглежда като нещо от сорта на това :
playerInfo[battle1].Values.Sum() > playerInfo[battle2].Values.Sum()
След като има дуел и някой е премахнат трябва да излезеш от foreach-a
защото после се опитваш отново да го премахнеш, а той не съществува.
Ето поправката:
using System;
using System.Collections.Generic;
using System.Linq;
namespace _04._MOBA_Challenger
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, Dictionary<string, int>> playerInfo = new Dictionary<string, Dictionary<string, int>>();
Dictionary<string, int> skills = new Dictionary<string, int>();
while (true)
{
List<string> person = Console.ReadLine().Split(new char[] { ' ', '-', '>' }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (person[0] == "Season" && person[1] == "end")
{
break;
}
if (!person.Contains("vs"))
{
string player = person[0];
string position = person[1];
int skill = int.Parse(person[2]);
if (!playerInfo.ContainsKey(player))
{
playerInfo.Add(player, new Dictionary<string, int>());
}
if (!playerInfo[player].ContainsKey(position))
{
playerInfo[player].Add(position, skill);
}
else
{
if (playerInfo[player][position] < skill)
{
playerInfo[player][position] = skill;
}
}
}
else
{
string battle1 = person[0];
string battle2 = person[2];
if (playerInfo.ContainsKey(battle1) && playerInfo.ContainsKey(battle2))
{
bool demoted = false;
foreach (var firstPlayer in playerInfo[battle1])
{
foreach (var secondPlayer in playerInfo[battle2])
{
if (firstPlayer.Key == secondPlayer.Key)
{
if (firstPlayer.Value > secondPlayer.Value)
{
playerInfo.Remove(battle2);
demoted = true;
break;
}
else if (secondPlayer.Value > firstPlayer.Value)
{
playerInfo.Remove(battle1);
demoted = true;
break;
}
}
}
if (demoted)
{
break;
}
}
}
}
}
foreach (var item in playerInfo.OrderByDescending(x => x.Value.Values.Sum()).ThenBy(x => x.Key))
{
Console.WriteLine($"{item.Key}: {item.Value.Values.Sum()} skill");
foreach (var stats in item.Value.OrderByDescending(x => x.Value).ThenBy(x => x.Key))
{
Console.WriteLine($"- {stats.Key} <::> {stats.Value}");
}
}
}
}
}
Евала, брато!
Докато писах дуелите си сложих нотабене за тия брейкове и като почнах да тествам абсолютно забравих :)
И на мен ми куцат последните два теста. Четири решения на колеги прегледах и пак не мога да си оправя кода. Ползвам отделен речник за Total skill за да мога да сортирам по него. Интересното е, че ако създам отделни речници на които да присвоя сортираните и по тях да итерирам в foreatch изкарвам 90/100, а ако сортирането е в цикала, както е в кода, който съм постнал, ми дава 80/100. Къде греша ?
Виж ако искаш моето решение (пак с два речника) докато погледна твоето.
https://pastebin.com/KgPBRvGR
Пфууу, намерих я най-после. При проверките за общ position при дуел с двата break-a чупиш само първия foreach, а трябва и двата. Аз сложих там една булева променлива и даде 100 т. Ти може да си пробваш и нещо друго. Заповядай:
https://pastebin.com/w1RFHq9G
Ееее, вече мога да спя спокойно. Мерси :)
Тоя въпрос е задаван вече сигурно 10 пъти,
виж: https://softuni.bg/forum/21034/moba-challenger
В режим на foreach не може да се трие от колекцията.
Ми сега как стана?
foreach(var element in collection.ToList()) {
collection.Remove(element);
}
Работило е при мен.
.ToList() го оправя / .ToArray()