Înainte de orice problemă

Reguli și șabloane

Cele 8 reguli de mai jos ar fi adus înapoi aproape toate punctele pierdute. Apoi: șablonul de pornire, funcțiile de știut pe de rost și lista de verificat înainte să apeși „Trimite”.

8 reguli

Reguli care îți salvează puncte

1

Citește tot inputul pe bucăți

inlocuireK: eroare

Nu te baza pe ReadLine rând cu rând. La inlocuireK, k și n erau pe același rând; la Secvente, numerele erau pe mai multe rânduri. Șablonul cu ReadToEnd().Split(...) merge mereu.

Așa nu
greșit
int k = int.Parse(Console.ReadLine());   // randul e "3 5" -> crapa
int n = int.Parse(Console.ReadLine());
Așa da
corect
int K = int.Parse(t[k++]);
int n = int.Parse(t[k++]);
2

Write vs WriteLine

Sort10: −80p, ElemPP: −100p

Write lasă cursorul pe același rând, WriteLine trece la rând nou. Din cauza asta s-au pierdut puncte la Sort10 (20) și ElemPP (0).

Așa nu
greșit
Console.WriteLine(v[i] + " ");   // fiecare numar pe alt rand
Așa da
corect
Console.Write(v[i] + " ");       // toate pe acelasi rand
3

Textul se scrie exact ca în enunț

Maxim: −20p

„NU EXISTA” nu e același lucru cu „nu exista”. Evaluatorul compară literă cu literă. La Maxim s-au pierdut 20 de puncte din asta.

Așa nu
greșit
Console.WriteLine("nu exista");
Așa da
corect
Console.WriteLine("NU EXISTA");
4

Vectorul are mărimea n

VerifDiferite: −60p

new int[n], nu un număr ales la întâmplare. La VerifDiferite, new int[200] cu n până la 500 a dus la 40 de puncte.

Așa nu
greșit
int[] v = new int[200];
Așa da
corect
int[] v = new int[n];
5

Min / max pornesc de la primul element

MinMax: trecut din noroc

mn = mx = v[0]. Nu porni de la 0, 10 sau 10000: dacă numerele sunt toate negative sau toate uriașe, răspunsul iese greșit.

Așa nu
greșit
int mn = 10000, mx = 10;
Așa da
corect
int mn = v[0], mx = v[0];
6

Șterge afișările de test

Afisare: 0p

Orice Console.WriteLine pus «ca să văd ce se întâmplă» strică răspunsul. La Afisare a dus la 0 puncte.

Așa nu
greșit
for (int i = 0; i < n; i++)
    Console.Write(v[i] + " ");   // TEST - uitat in cod!
Așa da
corect
// doar afisarile cerute de enunt
7

Fișiere: numele exact și Close()

risc de 0p

Numele fișierelor se copiază din enunț (minmax.in / minmax.out). Fără fout.Close(), fișierul de ieșire poate rămâne gol.

Așa nu
greșit
StreamWriter fout = new StreamWriter("MinMax.txt");
fout.WriteLine(rez);           // si fara Close()
Așa da
corect
StreamWriter fout = new StreamWriter("minmax.out");
fout.WriteLine(rez);
fout.Close();
8

Compilează înainte să trimiți

4 probleme: 0p

4 din 22 de probleme au fost erori de compilare (E.C.): paranteze lipsă, ' ' vs " ", = în plus. Rulează programul o dată pe exemplul din enunț.

Așa nu
greșit
char[] x = {" "};          // " " e text, nu caracter
int[] v = new int =[n];    // = in plus
Așa da
corect
char[] x = { ' ' };
int[] v = new int[n];
Copiază-l la fiecare problemă

Șablonul de pornire

Citește tot inputul o dată și îl taie în numere, deci nu mai contează dacă numerele sunt pe un rând sau pe mai multe. Variabila k arată la al câtelea număr ai ajuns. Lecția despre citire →

Program.cs · tastatură
using System;

class Program
{
    static void Main()
    {
        char[] sep = { ' ', '\n', '\r', '\t' };     // spatiu, rand nou, tab
        string[] t = Console.In.ReadToEnd().Split(sep, StringSplitOptions.RemoveEmptyEntries);
        int k = 0;                      // "degetul": al catelea numar urmeaza
        int n = int.Parse(t[k++]);
        int[] v = new int[n];
        for (int i = 0; i < n; i++)
            v[i] = int.Parse(t[k++]);

        // ... rezolvarea ...

        Console.WriteLine(rezultat);
    }
}
Write sau WriteLine?Write afișează și rămâne pe rând; WriteLine afișează și trece la rândul următor. Când enunțul spune „separate prin spațiu”, folosești Write(x + " ").
Apar în multe probleme

Funcții de știut pe de rost

Suma cifrelor

Suma cifrelor
static int SumaCifre(int x)
{
    int s = 0;
    while (x > 0) { s += x % 10; x /= 10; }
    return s;
}

Aduni ultima cifră, o tai, repeți până nu mai sunt cifre.

Folosită la:Numarare5

Oglinditul

Oglinditul
static long Oglindit(long x)
{
    long r = 0;
    while (x > 0) { r = r * 10 + x % 10; x /= 10; }
    return r;
}

Fiecare cifră nouă se pune la dreapta, iar cele vechi se «împing» spre stânga (·10).

Folosită la:EgaleOglindit

Număr prim

Număr prim
static bool EstePrim(int x)
{
    if (x < 2) return false;
    for (int d = 2; d * d <= x; d++)
        if (x % d == 0) return false;
    return true;
}

0 și 1 nu sunt prime. Cauți divizori doar până la radical (d·d ≤ x).

Folosită la:NrApPrimePrime4

Cmmdc (Euclid)

Cmmdc (Euclid)
static int Cmmdc(int a, int b)
{
    while (b != 0) { int r = a % b; a = b; b = r; }
    return a;
}

Împarți și păstrezi restul, până restul devine 0. Ultimul împărțitor e cmmdc-ul.

Folosită la:Numarare4

Pătrat perfect

Pătrat perfect
static bool PatratPerfect(int x)
{
    int r = (int)Math.Sqrt(x);
    return r * r == x;
}

Iei radicalul, tai zecimalele și verifici dacă la pătrat dă înapoi numărul.

Folosită la:ElemPP

Sortare + descrescător

Sortare + descrescător
Array.Sort(v);                     // crescator
for (int i = n - 1; i >= 0; i--)   // parcurs invers = descrescator
    Console.Write(v[i] + " ");

O singură linie sortează crescător. De la coadă obții ordinea descrescătoare.

Cum citești un enunț

5 întrebări, în ordinea asta

  1. Ce primesc? Citește «Date de intrare»: câte numere, în ce ordine, pe ce rânduri. Scrie-le pe hârtie.
  2. De unde citesc? Tastatură (Console) sau fișier (nume.in)? Asta schimbă doar începutul și finalul programului.
  3. Ce trebuie să afișez? Citește «Date de ieșire»: un număr? DA/NU? mai multe numere pe un rând? Exact ce text?
  4. Fac exemplul de mână Ia exemplul din enunț și rezolvă-l pe hârtie, fără cod. Dacă nu-l poți face de mână, nu-l poți programa.
  5. Cazurile speciale Ce fac dacă nu există nicio soluție? Dacă n = 1? La egalitate pe cine aleg?
Înainte să trimiți

Lista de verificat

0 din 9 bifate