Loading...
Valko98 avatar Valko98 7 Точки

C# Fundamentals - Lists - more exercises. 2. Car Race

Здравейте, хора!

Днес се опитах да реша ето тази задачка:

2.Car Race

Write a program to calculate the winner of a car race. You will receive an array of numbers. Each element of the array represents the time needed to pass through that step (the index). There are going to be two cars. One of them starts from the left side and the other one starts from the right side. The middle index of the array is the finish line. The number of elements in the array will always be odd. Calculate the total time for each racer to reach the finish, which is the middle of the array, and print the winner with his total time (the racer with less time). If you have a zero in the array, you have to reduce the time of the racer that reached it by 20% (from his current time).

Print the result in the following format "The winner is {left/right} with total time: {total time}".

Example

Input

Output

29 13 9 0 13 0 21 0 14 82 12

The winner is left with total time: 53.8

Comment

The time of the left racer is (29 + 13 + 9) * 0.8 (because of the zero) + 13 = 53.8

The time of the right racer is (82 + 12 + 14) * 0.8 + 21 = 107.4

The winner is the left racer, so we print it

 

А ето го и моя код:https://pastebin.com/qbHAWtGh

Линк към judge: https://judge.softuni.bg/Contests/Practice/Index/1300#1

Но нещо ми гърми judge и ми дава само 30/100, при положение че всичките мой входове ги изкарва добре кода. Моля за помощ да намеря грешката си, защото не мога да я забележа сам и моля за съвет как да не я допускам повече. 

Благодаря!

1
Programming Fundamentals
krum_43 avatar krum_43 756 Точки

Здравей колега,

Забелязах нещо,което може би ти чупи кода .

 var rightRacer = racetrack.GetRange(finishLine + 1, finishLine);

Там където вземаш часовете на вторият състезатезател ти трябва да вземеш часовете от finishLine + 1 до края на листа т.е. до елемента racetrack.count-1.

Или това е броя на елементите?

 

 

0
17/12/2019 09:55:31
Valko98 avatar Valko98 7 Точки

Самата функция изисква първо startindex след това count of elements. Дебъгвах и ми се струваха добре числата, но ще опитам пак

 

1
17/12/2019 12:43:36
krum_43 avatar krum_43 756 Точки

Да,проблема е някъде другаде.

В условието нищо не е казано какво трябва да се изведе ако времената на двамата състезатели са равни .

Ти принтираш  winner = "right",

                      :)

 

0
17/12/2019 17:47:43
Valko98 avatar Valko98 7 Точки

Предполагах, че това може да е грешка, но като гледах чужди решения те са постъпили като мен и взимат точките :D

 

1
FrauCules avatar FrauCules 1 Точки

Здравейте,
Имам същия проблем 30/100. Примера от заданието минава без грешка.
Ето решението ми в pastebin.com:
https://pastebin.com/2zQjCDJM
Моля за помощ. Благодаря предварително на отзовалите се. :)

 

0
nickwork avatar nickwork 657 Точки

Ето твоето решение вече дава 100/100...преправих него защото е по кратко от това на колегата Valko98

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace _02._Car_Race
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> time = Console.ReadLine()
                .Split()
                .Select(int.Parse)
                .ToList();
            double sumLeft = 0; // decimal е добре когато става въпрос за пари...тук може и дабъл да ползваме...даже judge дава 90/100 с децимал...
            double sumRight = 0;

            for (int i = 0; i < time.Count / 2; i++)
            {
                sumLeft += time[i];

                if (time[i] == 0)
                {
                    sumLeft *= 0.8;
                }
                //else
                //{
                //    sumLeft += time[i];
                //}

                //if (time[time.Count - i - 1] == 0)
                //{
                //    sumRight *= 0.8m;
                //}
                //else
                //{
                //    sumRight += time[time.Count - i - 1];
                //}
            }

            for (int i = time.Count - 1; i > time.Count / 2; i--)
            {
                sumRight += time[i];

                if (time[i] == 0)
                {
                    sumRight *= 0.8;
                }
            }

            //if (sumLeft <= sumRight) // тук как да разберем кой е победителя ако времето им е И равно "<="
            if (sumLeft < sumRight)
            {
                Console.WriteLine($"The winner is left with total time: {sumLeft}");
            }
            else
            {
                Console.WriteLine($"The winner is right with total time: {sumRight}");
            }
        }
    }
}

1
FrauCules avatar FrauCules 1 Точки

Благодаря, колега :)
 

0
Savas avatar Savas 38 Точки

Здравейте колеги,
подвеждането в тази задача идва от примера, където за победителя извеждат:

"The winner is left with total time: 53.8"

когато се самотестваш - получаваш 53.8000000000004, което явно навежда на мисълта, че изхода трябва да е отрязан до първия знак -->  :f1 (в което дори има нещо състезателно), но от друга страна, в условието няма нищо казано по този повод.

Който иска 100/100 - да не закръгля.

2
gkachakov avatar gkachakov 1 Точки

Savas, много добре казано, благодаря ти! yesДосега пробвах с какво ли не, но не и без закръгляне, именно заради примерния резултат 53.8. За пореден път губене на време вследствие на несъгласуваност между примерните входно-изходни данни и тестовите такива в Джъдж. no

1
kkoleff avatar kkoleff 3 Точки

Може да се използва потребителско форматиране на числов стринг, който променливата за total time връща. При мен задачата е 100/100 по този начин. Имам в предвид следното:

Console.WriteLine($"The winner is {winner} with total time: {time:#.#}");

Повече по темата за форматиране на стрингове:

https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings

Линк към моя сорс код:

https://pastebin.com/cfC2t3Yh

1
daniel123123 avatar daniel123123 27 Точки

C# 100/100 използвам float

using System;
using System.Linq;
class SoftUni {
    static void Main() {
        var nums = Console.ReadLine().Split().Select(int.Parse).ToList();
        float timeL = 0;
        float timeR = 0;
        for (int i = 0; i < nums.Count / 2; ++i) {
            timeL += nums[i];
            if (nums[i] == 0) {
                timeL *= 0.8f;
            }
        }
        for (int i = nums.Count - 1; i > nums.Count / 2; --i) {
            timeR += nums[i];
            if (nums[i] == 0) {
                timeR *= 0.8f;
            }
        }
        if (timeL < timeR) {
            Console.WriteLine($"The winner is left with total time: {timeL}");
        } else {
            Console.WriteLine($"The winner is right with total time: {timeR}");
        }
    }
}

 

0
nikofreesolo avatar nikofreesolo 1 Точки

Ето и моето решение ако някой може да му е полезно:

 

using System;
using System.Linq;

namespace List
{
    class List
    {
        static void Main(string[] args)
        {
            List<int> numbers = Console.ReadLine().
                Split().
                Select(int.Parse).
                ToList();

            
            double leftTime = 0;
            double rightTime = 0;
            

            for (int i = 0; i < numbers.Count / 2; i++)
            { 
                leftTime += numbers[i];

                if (numbers[i] == 0)
                {
                   leftTime = leftTime * 0.8; 
                }          
            }
            for (int i = numbers.Count-1; i > numbers.Count / 2; i--)
            {
                rightTime += numbers[i];

                if (numbers[i] == 0)
                {
                    rightTime *= 0.8;
                }
            }
             
            if (leftTime < rightTime)
            {
                Console.WriteLine($"The winner is left with total time: {leftTime}");
            }
            else if (rightTime < leftTime)
            {
                Console.WriteLine($"The winner is right with total time: {rightTime}");
            }
        }
    }
}

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.