TAKMIČENJA IZ PROGRAMIRANJA


Sva pitanja, predloge ili primedbe u vezi sa takmičenjima iz programiranja možete slati na e-mail:

tak.prog@gmail.com

U toku perioda za žalbe, sve žalbe možete slati na ovaj isti e-mail.

secenje.cpp    625 b      izvorni kod rešenja
secenje.tests.rar    1,262 b      test primeri
secenje.checker.cpp    486 b      izvorni kod programa za testiranje

zadatak: Sečenje broja

Data su dva prirodna broja n i m. Broj n možemo zapisati u dekadnom zapisu preko niza cifara kao n = ckck-1 ...c2c1.

Nad brojem n je moguće primeniti operaciju sečenja između neke dve uzastopne cifre. Ako broj n isečemo na dva dela između cifara i + 1 i i, i ∈ [1, k - 1] dobijamo dva nova broja n1 = ck... ci+1 i n2 = ci... c1. Pri ovom sečenju dozvoljen je i slučaj kada n2 počinje vodećim nulama, tj. kada je ci = 0.

Primer sečenja broja n = 30594.
Primer sečenja broja n = 30594 pri čemu se dobija n1 = 305 i n2 = 94.

Za date brojeve n i m naći sečenje broja n takvo da je apsolutna razlika sume dobijenih delova, n1 +n2 , i broja m minimalna. Drugim rečima, naći sečenje koje minimizira izraz

| m - ( n 1 + n 2) |

Ulaz.

(Ulazni podaci se nalaze u datoteci seksek.in.) U prvom i jedinom redu ulazne datoteke nalaze se dva prirodna broja n i m (10 ≤ n , m ≤ 10 18) opisana u tekstu problema. Brojevi n i m nemaju vodećih nula.

Izlaz.

(Izlazne podatke upisati u datoteku seksek.out.) U prvom i jedinom redu izlazne datoteke ispisati traženu vrednost (minimalnu apsolutnu razliku broja m i sume delova nekog sečenja broja n).

Primer 1.

seksek.in      seksek.out
30594 400
        
1

Objašnjenje.

Sva moguća sečenja i odgovarajuće apsolutne razlike za dati primer su:

n1 = 3 i n2 = 0594
   
197
n1 = 30 i n2 = 594
   
224
n1 = 305 i n2 = 94
   
1
n1 = 3059 i n2 = 4
   
2663
fajl: secenje.cpp
#include<stdio.h>
#include<math.h>
#define oo 1000000000000000000LL

long long n, m, sol;
FILE *in, *out;

  int main()
  {
    in =  fopen("sek-sek.in", "r");
    fscanf (in, "%lld %lld", &n, &m);
    fclose(in);

    sol = oo;
    long long n1 = n, n2 = 0;
    long long deg = 1LL;
    while (true)
    {
      n2 = n2 + deg * (n1 % 10LL);
      deg = deg * 10LL;
      n1 = n1 / 10LL;
      if (n1 == 0)
        break;

      long long tmp = n1 + n2 - m;
      if (tmp < 0)
        tmp = - tmp;
      if (tmp < sol)
        sol = tmp;
    }

    out = fopen("sek-sek.out", "w");
    fprintf (out, "%lld\n", sol);
    fclose(out);

    return 0;
  }