Loading...
Stefan77 avatar Stefan77 1 Точки

Питане за 2-ра задача от изпита Basically днес. Честита Цветница! Поздравления на всички с MAX

Здравейте,Честита Цветница!  Поздравления на всички изкарали 500 точки днес! Не съм между тях,единствено 2-ра задача ми се опъна (уж лесна),при нея достигнах само 50 точки. Макар и късно искам да разбера грешката си.:)  Ето кода:

using System;
using System.Collections.Generic;

namespace _2_Game_of_names
{
    class Program
    {
        static void Main()
        {//INPUT:
            int countplrs = int.Parse(Console.ReadLine());
            string[] players = new string[countplr];      
           // BigInteger[] scorePlayer = new BigInteger[countplrs];

           int[] scorePlayer=new int[countplrs];

            for (int i = 0; i < countplrs; i++)
            {
                 string name = Console.ReadLine();  
              //  BigInteger sumscore = BigInteger.Parse(Console.ReadLine());

                 int sumscore=int.Parse(Console.ReadLine());
                for (int letter = 0; letter < name.Length; letter++)
                {
                    int charnmbr = name[letter];
                    if (charnmbr % 2 == 0)
                    {
                        sumscore += charnmbr;
                    }
                    else {
                        sumscore -= charnmbr;
                    }
                }
                scorePlayer[i] = sumscore;
                players[i] = name;
            }

            //find winner
            int indexwinnner = 0;
            for (int i = 1; i < countplrs; i++)
            {
                if (scorePlayer[i -1] < scorePlayer[i])
                    indexwinnner = i;                

            }
         //OUTPUT:   
         Console.WriteLine("The winner is {0} - {1} points"
                  , players[indexwinnner], scorePlayer[indexwinnner]);
        }
    }
}

Тагове:
-2
Programming Basics
annsta avatar annsta 305 Точки
Best Answer

Неправилно правиш сравнение между резултатите на два поредни играча. При 3 играча и резултати {100, 98, 99} твоят алгоритъм ще покаже 99 като най-висок резултат. Затова трябва да използваш отделна променлива maxScore (тъй като правиш сравнение межди играчите с индекси от 1 до последни, maxScore = scorePlayer[0]), в която да съхраняваш най-голямия намерен резултат до момента и сравнението на текущия резултат на всеки играч да бъде към maxScore, а не с резултата на предходния играч.

if (scorePlayer[i] > maxScore)
{
   maxScore = scorePlayer[i];
   indexwinner = i;
}

 

4
Stefan77 avatar Stefan77 1 Точки

Я,като поразгледах сега май видях грешката. Дали не е в блока find winner?

0
TeodorDimitrov89 avatar TeodorDimitrov89 264 Точки

http://pastebin.com/RKkHNjeK

Това е което аз измислих

1
Thenis avatar Thenis 219 Точки

Ако това е. Има по-добър вариант. Това за мен е по-лесно.

Да си декларираш един празен string

string topName = null;

и единг int който е равен на Int32.MinValue;

int topScore = Int32.MinValue;

 

и накрая вместо твоя final winner block да напишеш

                if (sumscore > topScore)
                {
                    topScore = sumscore;
                    topName = name;
                }

PS Този if трябва да е вътре в първия for цикъл

1
24/04/2016 17:51:19
borislav9212 avatar borislav9212 745 Точки

Бих допълнил по добре е да се използва:  string topName = string.Empty; за празен string, вместо null.

 

1
Thenis avatar Thenis 219 Точки

Ето го в работещ вариант по който ти преложих в коментара.

На нулевия тест работи, но за съжеление няма как да проверим дали ще ни даде 100/100. Трябва да изчакаме да сложът изпита в practice mode.

http://pastebin.com/2re2RNgB

0
24/04/2016 18:01:40
PavelStoqnov1988 avatar PavelStoqnov1988 1 Точки

Празен стринг за името на победителя вместо лист!.Другото което е с един FOREACH много по-лесно и удобно събираш номера от буквите. Ако резултата е по-добър записваш новите стойности.Ето да се ориентираш:

ПС: Използвал съм decimal! Би трябвало да може и с по-малко , но съм го сложил за всеки случей :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Game_of_Names
{
    class Program
    {
        static void Main(string[] args)
        {
            var n = decimal.Parse(Console.ReadLine());
            var winner = "";
            decimal pointsOfWinner = decimal.MinValue;
            for (int i = 0; i < n; i++)
            {
                var name = Console.ReadLine();
                var num = decimal.Parse(Console.ReadLine());
                decimal points = 0;
                foreach (var letter in name)
                {
                    if (letter % 2 == 0)
                        points = points + letter;
                    else
                        points = points - letter;
                }
                points = points + num;
                if (points > pointsOfWinner)
                {
                    pointsOfWinner = points;
                    winner = name;
                }
            }
            Console.WriteLine($"The winner is {winner} - {pointsOfWinner} points");
        }
    }
}
 

0
24/04/2016 18:09:43
pspassova avatar pspassova 2 Точки

Моето решение изглежда по абсолютно същия начин, с изключение на double, но все пак я докарах до 70т., странно.

0
birkoff88 avatar birkoff88 -7 Точки

И аз се мъчих, но и аз с 70т. от тази задача. Някой друг с 70т. или повече от тази задача?

0
PavelStoqnov1988 avatar PavelStoqnov1988 1 Точки

ГЛЕДАЙТЕ ВНИМАТЕЛНО! ЧЕТЕТЕ БАВНО!!! Все някъде бъркате! Аз примерно на изпита  всички реших със 100 точки и първата задача накрая я дорешавах ПОВЕЧЕ ОТ ЧАС!!! Получавах 60 точки и блъсках на всякъде DECIMAL, LONG и всякакви подобни и не мърдаше и не мърдаше! После почнах да чета на ново условието и си видях къде ми беше грешката( в порциите - добавях ХОРА % 6  вместо да си добавя още една порция за 6 човека). Предните изпити като съм ги решавал пускам и гледам 70/ 100 и като тръгна да проверявам гледам, че вместо >= съм сложим само > !!! Седнете на спокойсвтие и помислете! Или дайте код да видя къде бъркате...

1
24/04/2016 19:14:26
birkoff88 avatar birkoff88 -7 Точки

Ето я и на джава.

public class GameOfNames {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int input = Integer.parseInt(sc.next());
        String storedName = "";
        int maxScore = 0;

        
        for(int i=0; i < input; i++){
            String Name = sc.next();
            int score = Integer.parseInt(sc.next());
            int ascii = 0;
            ascii += score;
            for(int j = 0; j < Name.length(); j++){
                if(Name.charAt(j) % 2 == 0){
                ascii += Name.charAt(j);
                }else {
                    ascii -= Name.charAt(j);
                }            
                
            }
            if (ascii > maxScore){

                storedName = Name;
                maxScore = ascii;
            }
            
        }
        
        System.out.println("The Winner is " + storedName + " - " +maxScore + " points");
    
    
    }

}

А сега честитете на човека, който с 3 решени задачи не можа да изкара 250т. :D Май се прецаках, че не писах на ШиШарп

0
yasen6275 avatar yasen6275 18 Точки
using System;
namespace namegame {
	class MainClass {
		public static void Main () {
			var players = int.Parse(Console.ReadLine ());
			string[] names = new string[players];
			int[] score = new int[players];
			int maxScore = int.MinValue;
			int winerIndex = 0;
			for (int i = 0; i < players; i++) {
				names[i]= Console.ReadLine ();
				score[i]= int.Parse(Console.ReadLine ());
				for (int j = 0; j < names[i].Length; j++) {
					if (names[i][j]%2==0) 
						score [i] += names [i] [j];
					else 
						score [i] -= names [i] [j]; }
				if (maxScore<score[i]) {
					maxScore = score [i];
					winerIndex = i;	}}
			Console.WriteLine ("The winner is {0} - {1} points",names[winerIndex], maxScore);}}}

 

-1
simeon.mihaylov95 avatar simeon.mihaylov95 18 Точки

Ако някой може да ми каже къде бъркам...
С долуполосоченото решение резултатът ми е 80 точки.

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

class Program
{
    static void Main()
    {

        int N = int.Parse(Console.ReadLine()); //players counter
        
        long bestScore = 0;

        string player = null;
        string playerName = null;
        long score = 0;

        for (int i = 0; i < N; i++)
        {
            playerName = Console.ReadLine();
            score = long.Parse(Console.ReadLine());

            foreach (var item in playerName)
            {
                if (item % 2 == 0)
                {
                    score += item;
                }
                else
                {
                    score -= item;
                }
            }

            if (score > bestScore)
            {
                bestScore = score;
                player = playerName;
            }
        }

        Console.WriteLine($"The winner is {player} - {bestScore} points");
    }
}

 

0
gadjov avatar gadjov 115 Точки

Здравей, bestScore ти е 0 и ако името което въведеш има повече нечетни числа score  ще ти е отрицателно, демек няма да мине проверката if (score > bestScore)

Трябва да зададеш на bestScore = long.minValue

3
Stefan77 avatar Stefan77 1 Точки

НАМЕРИХ грешката си! Не точно така както ти пишеш,но проблема е подобен. Алгоритъмът ми за търсене на MAXvalue from array е неправилеk-при максимална стойност на първа позиция (indexwinner=0) правил ния отговорa се прескача. Направих свои данни за тест и малко промени в алгоритъма.   Данни за тест: ггттТест 1: Тук отговора е Preslavy,но по моя начин се прескача
//4
//Preslava
//123
//Preslavy
//123
//Preslavi
//123
//Preslave
//123
Тест 2: Тук отговора е Preslavy,но по моя начин става Preslavj
//4
//Preslavy
//123
//Preslava
//123
//Preslavi
//123
//Preslavj
//123

Направих малки промени в кода си и грешката се оправи:

...

// if (scorePlayer[i-1] < scorePlayer[i])//izpiten code greshen
//indexwinnner =i;
if (scorePlayer[indexwinnner] < scorePlayer[i])//promenen code pravilen
  indexwinnner = i;

.....

 

-1
Stefan77 avatar Stefan77 1 Точки

Да,borislav9212 ти си направил директно сравнение при задаване на стойност. Но аз търсех моята грешка и я разбрах.

Направих малки промени в кода си и грешката се оправи:

...

// if (scorePlayer[i-1] < scorePlayer[i])//izpiten code greshen
//indexwinnner =i;
if (scorePlayer[indexwinnner] < scorePlayer[i])//promenen code pravilen
  indexwinnner = i;

.....

За мен въпроса е приключен.Благодаря ви ,колеги!

0
24/04/2016 23:42:31
dimo.ivanov avatar dimo.ivanov 35 Точки

Ето и един вариант за решение с Dictionary... може би малко по-кратък като код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            var scores = new Dictionary<int, string>();

            for (int i = 0; i < n; i++)
            {
                string name = Console.ReadLine();
                int Sum = int.Parse(Console.ReadLine());
                for (int j = 0; j < name.Length; j++)
                {
                    if (name[j] % 2 == 0)
                    {
                        Sum += name[j];
                    }
                    else
                    {
                        Sum -= name[j];
                    }
                }
                if (!scores.ContainsKey(Sum))
                {
                    scores[Sum] = name;
                }
            }

            Console.WriteLine($"The winner is {scores[scores.Keys.Max()]} - {scores.Keys.Max()} points");
        }
    }
}

 

0
InaPanova avatar InaPanova 28 Точки

И аз мислех за Dictionary, но тъй като не съм го упражнявала достатъчно реших да попитам ментор по време на изпита - той ми отговори, че дори е препоръчително да НЕ използваме Dictionary, а да намерим друга логика - щеше да е лесно ако го нямаше разделението на четни и нечетни ст-ти от ASCII таблицата, а именно просто връщаш сумата като string. Аз използвах 2 List-a (names и score) и някак я докарах до 70, но сложих сумата в един List и с list.Max(); изкарах максималните ст-ти. Това е добър начин и за някои други задачи, в които не знаеш колко променливи да сравняваш. 

2
dimo.ivanov avatar dimo.ivanov 35 Точки

Аз реших, че казват "не" използвайте Dictionary ;)

0
InaPanova avatar InaPanova 28 Точки

Като за втора задача има различни варианти за решаване. dimo.ivanov, сега видях твоето решение и се убеждавам, че Dictionary-то си е много подходящо в случая. 

1
dimitur_botev avatar dimitur_botev 112 Точки

Здравей! Моето решение на задачата имам 100/100. Бъркаш при сравняването, защото не запазваш най-добрия резултат, а просто сравняваш две двойки. По този начин индекса ти винаги ще е от последната двойка числа която отговаря на условието, а не най-голямото. Алтеранитво решение - намираш макс стойността в масива и после  и намираш индекса. И от там принтиш тази стойност и името :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GameOfNames
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int counter = 0;
            string bestPlayer = string.Empty;
            int bestScore = 0;
            string name = string.Empty;
            int score = 0;
            while (true)
            {
                if(counter == n)
                {
                    break;
                }
                 name = Console.ReadLine();
                 score = int.Parse(Console.ReadLine());

                for(int i =0; i < name.Length; i++)
                {
                    int ASCINumber = (int)name[i];
                    if(ASCINumber % 2== 0)
                    {
                        score = score + ASCINumber;
                    }
                    else
                    {
                        score = score - ASCINumber;
                    }
                    
                }
                if(counter == 0)
                {
                    bestScore = score;
                    bestPlayer = name;
                }
                if (score > bestScore)
                {
                    bestScore = score;
                    bestPlayer = name;
                }
                counter++;
            }

            Console.WriteLine("The winner is {0} - {1} points",bestPlayer,bestScore);
        }
    }
}

 

0
25/04/2016 11:43:35
NikolayRogchev avatar NikolayRogchev 12 Точки

Колега, само вмъквам, че по правило името на променливата трябва да започва с малка буква. Пример "asciiNumber". Ако не се лъжа само методите и класовете започват с главна буква.

-2
dimitur_botev avatar dimitur_botev 112 Точки

Да за променливата конвенцията е pascal case просто ASCII е съкращение. А за кода, непременно следващият път ще използвам или  github или от pastebin

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