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.

sumarum.cpp    1,158 b      izvorni kod rešenja
sumarum.pas    1,024 b      izvorni kod rešenja
sumarum.tests.rar    6,682,831 b      test primeri

zadatak: Sumarum

Đurica je pronašao n karata poređanih u niz. Na kartama su zapisani celi brojevi. Datom nizu karata A, Đurica dodeluje vrednost f(A) koja je jednaka sumi razlika vrednosti na uzastopnim kartama. Formalno,
f(A) = Σ(Ak + 1 - Ak), k = 1 .. n - 1
gde Ai predstavlja vrednost na i-toj karti u nizu.

Đurica iz niza želi da izbaci najviše K karata. Izbacivanjem nekih m karata, mK, dobija nov niz karata kojem ponovo računa vrednost na opisani način. Od svih mogućih odabira vrednosti m i svih mogućih odabira m karata koje će izbaciti, njega zanima onaj niz karata koji će imati najveću vrednost. Pomozite Đurici i recite mu koliko je ta najveća vrednost. Primetimo da Đurica ni u jednom momentu ne menja raspored karata datih na početku.

Ulaz.

(Ulazni podaci se učitavaju iz datoteke sumarum.in.) U prvom redu nalaze se celi brojevi n (2 ≤ n ≤ 500.000) i K (0 ≤ Kn - 2). U narednom redu se učitavaju celi brojevi Ai (-1.000.000 ≤ Ai ≤ 1.000.000), u i-tom redu broj Ai.

Izlaz.

(Izlazne podatke upisati u datoteku sumarum.out) U prvom i jedinom redu ispisati jedan ceo broj koji predstavlja najveću vrednost niza koju Đurica može da dobije od početnog izbacivanjem najviše K karata.

Primer 1.

sumarum.in      sumarum.out
11 4
1 7 2 5 3 8 2 3 6 5 5
        
5

Objašnjenje.

Jedno optimalno rešenje je da se izbacimo 3 karte iz niza. Karte koje treba izbaciti imaju na sebi vrednost 5.

Primer 2.

sumarum.in      sumarum.out
3 1
10 9 8
        
-1
fajl: sumarum.cpp
/*
  Autor: Slobodan Mitrovic
*/
#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>
#include <cmath>
#include <time.h>
#define ffor(_a,_f,_t) for(int _a=(_f),__t=(_t);_a<__t;_a++)
#define all(_v) (_v).begin() , (_v).end()
#define sz size()
#define pb push_back
#define SET(__set, val) memset(__set, val, sizeof(__set))
#define FOR(__i, __n) ffor (__i, 0, __n)

using namespace std;

const int MAXN = 500000;

int mmax[MAXN], mmin[MAXN], a[MAXN];

int main(){
  FILE *fin;
  FILE *fout;
  fin = fopen("sumarum.in", "r");
  fout = fopen("sumarum.out", "w");
    
  int n, k;
  fscanf(fin, "%d %d", &n, &k);
  FOR (i, n)
    fscanf(fin, "%d", &a[i]);
  
  mmax[n - 1] = a[n - 1];
  for (int i = n - 2; i > -1; i--)
    mmax[i] = max(a[i], mmax[i + 1]);
    
  
  mmin[0] = a[0];
  ffor (i, 1, n)
    mmin[i] = min(a[i], mmin[i - 1]);
      
  int idxLeft = 0, idxRight = n - k - 1, ret = -(1 << 30);
  FOR (i, k + 1){
    ret = max(ret, mmax[idxRight] - mmin[idxLeft]);
    idxLeft++;
    idxRight++;
  }
  
  fprintf(fout, "%d\n", ret);
  fclose(fin);
  fclose(fout);
  return 0;
}
fajl: sumarum.pas
(* Autor: Slobodan Mitrovic *)
program sumarum;
var
  mmax, mmin, a : array [0 .. 499999] of longint;
  n, k, i, idxLeft, idxRight, ret : longint;
  f : text;
  
function max(x, y : longint) : longint;
begin
  if (x > y) then
    max := x
  else
    max := y;
end;

function min(x, y : longint) : longint;
begin
  if (x < y) then
    min := x
  else
    min := y;
end;

begin
  assign(f, 'sumarum.in');
  reset(f);
  readln(f, n, k);
  for i := 0 to n - 1 do
    read(f, a[i]);
    
  mmax[n - 1] := a[n - 1];
  for i := n - 2 downto 0 do
    mmax[i] := max(a[i], mmax[i + 1]);
      
  mmin[0] := a[0];
  for i := 1 to n - 1 do
    mmin[i] := min(a[i], mmin[i - 1]);
        
  idxLeft := 0;
  idxRight := n - k - 1;
  ret := -1000000000;
  for i := 0 to k do
    begin
      ret := max(ret, mmax[idxRight] - mmin[idxLeft]);
      inc(idxLeft);
      inc(idxRight);
    end;
  
  dec(idxRight);
  dec(idxLeft);
  assign(f, 'sumarum.sol');
  rewrite(f);
  writeln(f, ret);
  close(f);
end.