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.

plusminus.cpp    829 b      izvorni kod rešenja
plusminus.tests.7z    844,972 b      test primeri

zadatak: Plus-minus

Dat je niz znakova (s1, ..., sn) dužine n. Znak si je + ili -. Dat je niz od n + 1 brojeva (a1, ..., an + 1).

Treba rasporediti brojeve u dati niz znakova tako da vrednost dobijenog izraz bude maksimalna. Formalno, treba naći vrednost val koja je definisana na sledeći način:

val = max{ap(1) s1 ... ap(n) sn ap(n + 1) | p je permutacija brojeva od 1 do n + 1}

Ulaz.

(Ulazni podaci se učitavaju sa standardnog ulaza.) U prvom redu standardnog ulaza nalazi se prirodan broj n (1 ≤ n ≤ 100000). U drugom redu nalazi se n znakova, redom od s1 do sn. Svaki znak je karakter '+' ili '-'. Znakovi nisu odvojeni razmakom. U trećem redu se nalazi n + 1 brojeva, brojevi od a1 do an + 1, odvojenih razmakom. Svaki od tih brojeva je iz intervala [0, 1000000].

Izlaz.

(Izlazne podatke ispisati na standardan izlaz.) U prvi i jedini red standardnog izlaza ispisati traženu vrednost, odnosno vrednost val.

Primer 1.

standardni ulaz      standardni izlaz
3
+-+
1 2 3 4
        
8

Objašnjenje.

Jedno rešenje predstavlja raspored brojeva
2+3-1+4

Primer 2.

standardni ulaz      standardni izlaz
2
++
1 3 2
        
6

Objašnjenje.

Bilo koji raspored brojeva vodi ka optimalnom rešenju.

Primer 3.

standardni ulaz      standardni izlaz
4
----
3 12 1 2 0
        
6

Objašnjenje.

Bilo koji raspored takav da je na prvom mestu broj 12 vodi ka optimalnom rešenju.

fajl: plusminus.cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <fstream>
#include <vector>
#include <cmath>
#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 = 100001;

int a[MAXN];

char str[MAXN + 10];

int main(){
  int n;
  scanf("%d", &n);
  scanf("%s", str);
  FOR (i, n + 1)
    scanf("%d", &a[i]);
    
  int cnt = 0;
  FOR (i, n)
    cnt += str[i] == '-';
  sort(a, a + n + 1);
  long long ret = 0LL;
  FOR (i, n + 1)
    if (i < cnt)
      ret -= a[i];
    else
      ret += a[i];
  
  printf("%lld\n", ret);
  return 0;
}