giovedì 7 agosto 2014

ATTENZIONE

ATTENZIONE!!!!!!!!!!!!!!!!!!!!!!!

ci siamo trasferiti a : http://dakation.altervista.org/infoguide/

sabato 19 luglio 2014

Convertire un pdf in bianco e nero in un comando con Linux

Grazie al software opensource To Black and White potremmo convertire i nostri documenti in bianco e nero in pochi secondi:

Installiamo To Black and White:
sudo add-apt-repository ppa:dpd-/ppa -y
sudo apt-get update -y
sudo apt-get install tobw -y
L'utilizzo è semplice:
tobw file.pdf
E otterremo il file risultante nella stessa cartella dell'input.
 

Creare un pacchetto e pubblicarlo su Launchpad

Abbiamo realizzato un programma in bash, c, c++, python, gambas, .... e vogliamo pubblicarlo? ecco come si fa:

lunedì 9 giugno 2014

UEFI Secure Boot: è sicuro per noi o per loro?

Microsoft ha imposto già da tempo ai produttori di computer di venderli con UEFI attivato, ma cos'è
UEFI?

UEFI è un'alternativa al BIOS nelle schede madri che dovrebbe avere questi vantaggi:

  • Miglioramento della sicurezza nella fase di avvio.
  • Maggiore velocità dei tempi di avvio e di ripresa dallo stato di ibernazione.
  • Supporto di unità maggiori di 2,2 terabyte (TB).
  • Supporto di driver di dispositivi firmware a 64 bit che il sistema può utilizzare per indirizzare più di 17,2 miliardi di gigabyte (GB) di memoria durante l'avvio.
  • Possibilità di utilizzare il BIOS con hardware UEFI.
    Fonte: Microsoft
Il bollino traditore, simbolo della presenza di UEFI.
Ma in pratica è una garanzia per la Microsoft dal momento in cui su una macchina UEFI puoi installare solo Windows e da Win 8 in poi; e una garanzia per i produttori di schede in quanto funzionano solo le schede certificate (il certificato è a pagamento).

Questo chiude il mondo dell' open: i sistemi open source come Linux non potranno più essere installati e molte schede open hardware non potranno essere utilizzate.

Microsoft si difende dicendo che non obbliga a usare UEFI: obbliga solo a vendere pc con UEFI attivato e che gli utenti possono disattivarlo dalle impostazioni del BIOS, ma il problema è che non in tutti i computer si può disattivare: in molti è obbligatorio!

La Free Software Foundation ha aperto una petizione contro il UEFI obbligatorio: se vuoi partecipare clicca su questo link!


Comunque Windows 8 e 8.1 si possono installare anche con UEFI disabilitato, quindi permettendo la coesistenza Win-Linux.

Per i computer con UEFI non disabilitabile si possono usare alcune versioni di Linux contenenti una chiave UEFI comprata da Matthew Garrett integrata nel loader Shim:

  • Ubuntu 12.10 (solo nella versione 64 bit) e Ubuntu 13.04
  • Fedora 18 
  • Sabayon 11
  • Arch Linux (vedi Wiki)
  • openSUSE 12.3
  • Linux Mint 15 Olivia (anche se non confermato dovrebbe supportare UEFI)

martedì 3 giugno 2014

VLC volume a 150%? portalo a 200%!

Con gli ultimi aggiornamenti di VLC non si può alzare il volume più del 125%, questo è stato pensato

per evitare distorsioni, ma quando si ascoltano canzoni a basso volume occorre alzare oltre questa soglia.

In realtà in VLC il volume si può alzare fino al 300%: basta solo impostare il livello-soglia:

Aprite VLC, andate su strumenti-> preferenze
Ora aprite la visualizzazione tutto (1), poi andate su interfaccia (2) -> Qt (3) e in fondo trovate la voce "Volume massimo visualizzato" dove (4) potete mettere la vostra soglia fino a 300. Infine salvate (5).

giovedì 22 maggio 2014

Storia del computer

È noto quasi a tutti che fin dalla prima metà dello scorso millennio i cinesi ebbero un particolare
Abaco cinese e abaco moderno
interesse per la matematica e per l'automazione dei calcoli: esempi che possiamo ancora vedere ai giorni nostri sono abaco e pallottoliere; ma pochi sanno che fin dal XIX secolo si sono create macchine molto vicine ai moderni computer.
La macchina analitica di Charles Babbage ne è l'esempio per eccellenza: era una macchina, di grandi dimensioni, che permetteva di fare le principali operazioni matematiche e di visualizzarne il risultato grazie a delle ruote con impresse le dieci cifre, inoltre il progetto originale prevedeva un sistema per stampare su carta la cronologia dei calcoli effettuati, ma non furono trovati i fondi necessari a costruirla. Recentemente è stata realizzata una macchina analitica compresa di "stampante" funzionante seguendo i progetti originali e utilizzando solo materiali all'epoca conosciuti: secondo alcuni esperti, se si fossero trovati i fondi necessari, i moderni computer potrebbero aver visto luce molti anni prima.

Macchina analitica
Ada Lovelace, figlia del poeta inglese Lord Byron e anche vissuta nel XIX secolo, compì studi approfonditi sulla macchina analitica e scrisse il primo programma della storia, appunto per questa macchina: si tratta di una serie di istruzioni, scritte su schede perforate, per calcolare i numeri della serie di Bernoulli.
Per molti anni le istruzioni vennero scritte su schede perforate. Un esempio famoso ne è l'Eniac, anche per un preciso fatto: un giorno un insetto (in inglese bug) si infilò in una scheda perforata danneggiando gravemente la macchina, è per questo che oggi quando c'è un problema o un errore in un programma informatico si parla di bug.

Agli inizi dello scorso secolo Alan Turing descrisse una macchina (Macchina di Turing) che non faceva
Versione della macchina analitica realizzata coi Lego
solo determinate operazioni, ma tante quante ne erano descritte nei vari programmi: la macchina leggeva una serie di uni e di zeri che descrivevano i processi da fare.
Questo permetteva di sviluppare algoritmi per ogni tipo di problema, a patto di dover semplificare ogni problema in problemi più piccoli (ricorsione).
Durante la seconda guerra mondiale Turing fece parte del dipartimento di comunicazione inglese per decriptare i messaggi in codice tedeschi, i quali erano codificati dalla macchina Enigma: un insieme di servomotori che facevano variare continuamente il codice.
Turing inoltre inventò un test per verificare quando l'intelligenza artificiale sarebbe stata pari a quella umana: una persona pone una domanda e riceve una risposta da una persona reale e una dalla macchina, quando non saprà distinguerle allora l'intelligenza artificiale avrà raggiunto alti livelli.

Doodle dedicato dalla Google ad Alan Turing
È grazie a queste e a molte altre persone che oggi abbiamo tutte quelle tecnologie basate sui calcoli automatici (computer,cellulari, ma anche orologi,riscaldamento,domotica,...) e se vediamo i progressi fatti in due secoli e i progressi fatti negli ultimi dieci anni possiamo notare come ci sia una sempre più crescente evoluzione di queste tecnologie; e non solo non possiamo immaginare cosa ci sarà fra un secolo: non possiamo immaginare cosa ci sarà fra un anno!

mercoledì 21 maggio 2014

Alla ricerca del prodotto giusto...

Le caratteristiche di un pc.
Anni fa era bello andare nei reparti informatici dei negozi perché si potevano osservare tutte le novità
del momento, alcune volte anche provarle, ma sopratutto avere una visione d' insieme di come si evolveva il mondo informatico.
Merito di tutto ciò erano le etichette curate che riportavano tutti i dettagli tecnici dei prodotti.

Dopo molti anni sono tornato in vari negozi nei reparti informatici e ho notato che purtroppo la storia è cambiata: la maggior parte dei prodotti in esposizione sono scatole, a volte trovi un' etichetta con scritta a volte la ram (la marca non il valore) o il processore e al posto dei dettagli tecnici trovi cartelli con scritto: "leggero, veloce, ergonomico, bello,..."
Purtroppo ho constatato questo anche nei siti dei produttori: solo pochi siti mantengono ancora le caratteristiche, e sono solitamente in una scheda secondaria, dopo foto e "leggero, veloce, ergonomico, bello,..."
Ora sul sito del produttore non scrivono più le caratteristiche, ma
solo le "impressioni d'uso".

I tempi sono cambiati e i computer non sono più una nicchia ma sono diventati il principale prodotto, quindi il commercio punta all' illusione e al far parere bello: chi va a comprare un computer se gli dici che ha 4 core da 2 GHz e 16GiB di ram? nessuno ma se gli dici ultrabook con superprocessore e durata eccezionale della batteria lo comprano al volo!
Anche gli schermi: perché farli lucidi? Essendo lucidi riflettono tutta la luce e diminuiscono la visibilità, mentre se fossero opachi sarebbe molto meglio; ma chi va a comprare un monitor opaco? I monitor lucidi quando sono spenti hanno un' estetica migliore e creano più guadagni.

I produttori stanno appunto attuando una strategia di commercio per vendere tutto a tutti, mettendo così in difficoltà chi sa cosa cercare, perché ormai non ti vendono il computer ma le parole.

mercoledì 14 maggio 2014

Doppia icona Chrome in Luncher o Docky?

inizio
2 icone 
Chrome (ma questo vale anche per altri programmi come LibreOffice) a volte si apre in un'icona diversa da quella bloccata nella dock, questo perchè il suo collegamento non punta la programma ma ad un altro collegamento.
Per risolvere questo problema non ci vuole molto:

risultato
  1. Apri un terminale e digita
               xprop | grep WM_CLASS | awk '{print $4}'
    e cliccando su una finestra di Chrome otterrai qualcosa tipo: Google-chrome-stable
  2. Nel terminale digita
                 sudo nautilus /usr/share/applications/     (se usi un filemanager diverso da nautilus va bene comunque)
    apri google-chrome.desktop con un editor di testo come gedit e aggiungi la segunete riga:
                 StartupWMClass=Google-chrome-stable
  3. Riavvia Docky o Unity

Synapse, un'alternativa alla Dash

Interfaccia di Synapse
Con le ultime versioni di Ubuntu il menù applicazioni è stato sostituito dall' innovativa dash.
La dash permette di cercare app, file, musica, video,.. semplicemente scrivendo alcune lettere del nome.
Il problema più grande è che occupa molta memoria ed è poco efficiente.
Più risulatiti
Synapse è un tool che occupa poca memoria e può sostituire la dash con la differenza di essere molto più veloce grazie all' indicizzazione dei file; Synapse è adatto a tutti i computer: dai nuovi modelli a quelli più vecchi e con qualsiasi distribuzione Linux e con qualsiasi DE.

Apri con...
Per avviarlo basta premere Ctrl+Space (ispirato al Cmd+Space di Spotligth), scorciatoia che potete cambiare, e digitare alcune lettere di ciò che cercate (anche saltandone alcune), poi premete invio per aprire.
Ci sono estensioni come la calcolatrice
Se volete più risultati premete la freccia giù e se cercate specificatamente un programma, un documento, un'immagine,... scorrete le sezioni con le frecce sx/dx.
Con Tab scorrendo con la fraccia giù potete cambiare il programma con cui aprire i file.


INSTALLAZIONE
sudo add-apt-repository ppa:synapse-core/ppa
sudo apt-get update -y
sudo apt-get install synapse -y



martedì 13 maggio 2014

Ancora Windows?

Esistono svariati sistemi operativi, fra cui ricordiamo Windows, le miriadi di release di Linux e OSX; eppure quando ci guardiamo attorno siamo circondati da computer Windows, quindi pensiamo che Windows sia il migliore, ma invece...

Un altro fatto importante è la fine di supporto di Windows XP: in realtà si potrà continuare a usare Windows XP senza problemi, con solo due differenze:
- Non riceverete più aggiornamenti dalla Microsoft (Alleleja!)
- La Microsoft non vi darà più supporto gratuito (Prima lo faceva?)
Invece quasi tutti hanno capito che dovevano cambiare compueter (proprio quello che la Microsoft voleva), ma a discapito di questa le vendite di Windows non sono salite di molto: alcuni hanno scelto Mac (con i relativi costi da supportare), mentre altri hanno optato per Linux.

Linux? Chi è sto sconosciuto?
Ebbene si in pochi conoscono Linux ed è un peccato, scopriremo ora perchè conviene passare a Linux che comprare un nuovo Windows.




  1. REQUISITI MINIMI
    Windows 8.1                       Linux Ubuntu
    20 GiB HDD                       10 GiB HDD
    2 GiB Ram                           512 MiB Ram (= 0,5 GiB)
    1 P  Processore                     0,7 P  Processore            [P = GHz * core]
    Scheda grafica DirectX 9     Scheda grafica generica

    Come si può notare Linux generalmente richiede meno risorse di Windows (esistono alcune versioni come Xubuntu o Lubuntu che addirittura richiedono meno prestazioni che Ubuntu !!!).
    Con questo si può riutilizzare un vecchio computer o comprarne uno poco potente abattendo notevolmente i costi.
  2. PREZZI
    Beh Windows ha calato i prezzi con l' avvento di Windows 8, mentre Linux è rimasto sempre costante nei prezzi:
    (prezzi medi in data di uscita)
    Windows 7        300€                                   Ubuntu 9.10        gratis
    Windows 8.1     100€                                   Ubuntu 13,10      gratis
  3. SICUREZZA
    Con Win chiunque sa prendere Virus: basta non avere l' antivirus o un antivirus impreparato ( e con la velocità con cui creano nuovi virus un antivirus risulta impreparato 15 minuti prima che esca l' aggiornamento).
    Con Linux solo uno stupido sa installare i virus: bisogna scaricare i file, dargli il permesso di esecuzione, fare doppio click e digitare la password di amministratore.
    Richiesta di password Linux

    Questo in quanto Linux è un sistema a guscio: ogni livello è protetto, mentre Windows non è a guscio: dopo il primo accesso (quando accendete il computer) lascia la porta aperta, questo è comodo per chi non vuole mettere la password per ogni cosa ma è molto insicuro.
    Appunto per questo si sono scoraggiati gli sviluppatori e i virus per Linux sono pochissimi.
  4. INSTALLAZIONE
    Se avete un computer vuoto i tempi di installazione sono molto diversi, riportiamo qui le medie:
    Windows      50 minuti                   Linux    20 minuti
    Guida passo passo
  5. DRIVER
    Windows per funzionare a bisogno di tutti i driver, solo con Windows 8 vengono inclusi alcuni driver fondamentali; questo comporta una perdita di tempo, un ingombro di memoria fisica (RAM) e di storage (HDD).
    In Linux invece vi è incluso il 99% dei driver e appena lo installate lo potete subito usare.
  6. TEMPI DI AVVIO E SPEGNIMENTO
    Se siete utenti Windows di certo odierete gli avvii del sistema, ma con Linux i tempi si riducono
    di quasi il 50%, inoltre quando compare lo sfondo Linux può essere usato, mentre su Win compare la clessidra e devi aspettare che carichi i componenti di sistema.
    Da Windows 8 i tempi di avvio somigliano diminuiti, in realtà Win 8 e 8.1 non si spengono: chiudono tutti i programmi e si ibernano (attenzione però recuperare i dati da un HDD ibernato può causare perdite di dati).
  7. DEFRAMMENTAZIONE
    Un buon utente Win deframmenta regolarmente  i suoi dischi, un buon utente Linux non sa cosa vuol dire deframmentare: scordatevi i pomeriggi lunghi ad attendere che il computer termini questo processo perchè Linux usa flesystem molto più avanzati di FAT e NTFS (unici di Win).
  8. AGGIORNAMENTI
    Su Windows bisogna aggiornare tutti i programmi manualmente e separatamente aggiornare il sistema operativo, quest' ultima procedura si compone di tre parti: attendi l' installazione degli aggiornamenti, attendi uno spegnimento molto più lungo del solito, attendi un tempo
    Aggiornamento in un click
    di avvio molto più lungo del solito.
    Su Linux compare una finestrella, con un (1)  click su aggiorna e in 5 minuti (mentre fai altro) aggiorna sistema operativo e tutti i programmi e non occorre attendere altro tempo.
  9. SOFTWARE
    Su Windows il buon software è a pagamento e spesso a caro prezzo, mentre
    Microsoft Office su Linux
    su Linux torvate il 99% dei programmi gratuiti che si trovano anche su Win e una miriade di programmi (tutti gratuiti) che sono allo stesso livello (a volte anche superiori) ai rispettivi a pagamento per Win.
    Se siete affezionati ai software Win potete usare Wine: un programma che permette l' avvio di una buona parte degli applicativi Win su Linux.
    Inoltre potete trovare tutto il software Linux su Ubuntu Software Center (simile a Windows Store di Win 8 ma uscito molti anni prima)
  10. PERSONALIZZAZIONE
    Su Windows ci sono alcune impostazioni personali e alcune personalizzazioni, su Linux puoi scegliere tutto al 100%: non solo nome e colori ma anche tantissime altre cose!!!
    Alcuni DE di Linux
  11. ASSISTENZA
    Hai problemi con Win? Sul sito Microsoft non trovi nulla e devi pagare un tecnico, con Linux hai miriadi di forum (il più popolare è Ubuntu Forum) con utenti che gratuitamente danno supporto 24h su 24 e 365 giorni l' anno (io ho postato un problema la mattina di Natale e in meno di 15 minuti ho ricevuto già 3 risoluzioni)
  12. RETI
    Windows in rete comunica solo con Windows ( o Linux che gli danno il permesso) e a volte fa fatica anche così. Con Linux potete comunicare con tutti i sistemi informatici (non solo computer, ma anche consolle,...).
    Le aziende possono usando Linux Server gestire tutti i computer della ditta indipendentemente che essi abbiano Linux, Win o Mac, mentre con Win Server puoi gestire solo i pc con Win.
  13. MOBILE
    Un argomento importante sono i sistemi operativi per Smartphone: Windows Phone vs Linux.
    Linux su tutti i dispositivi

    Windows Phone è uno dei sistemi mobile meno conosciuti, con un numero limitato di app (solitamente copioni di app Android e iOS) che punta all' estetica più che al software.
    Dal lato Linux abbiamo Android, che si contende il podio con iOS, il cui unico punto debole è la sicurezza (Google ha scelto di abbandonare molti punti del guscio Linux a favore di un' interfaccia più semplice) e Ubuntu Phone: permette l' esecuzione delle app desktop per Linux con un interfaccia riscritta per i Touch.

Beh che dire Linux è risparmio e sicurezza, provare per credere.
Se volete potete provare Linux senza installarlo: usate il Live CD.

giovedì 10 aprile 2014

Compilare eseguibili Windows su Linux

Tempo fa avevamo visto come compilare C++ per Linux su Linux, oggi vedremo come compilare per Windows su Linux (il risultante sarà in 32bit):

inanzitutto installiamo MingW:
sudo apt-get install g++ -y
sudo apt-get install mingw32 -y
sudo apt-get install mingw32-binutils -y
sudo apt-get install mingw32-runtime -y
Non preoccupatevi se da errore su uno dei quattro

Poi andiamo a compilare:

i586-mingw32msvc-g++ sorgente.cpp -o compilato.exe

Tutti i caratteri con Linux

Ecco un semplice schema esemplificativo di come fare tutti i caratteri con Linux (schema relativo alla tastiera italiana):
Ricordo che è inoltre possibile inserire direttamente il codice Unicode del carattere:
Ctrl+Shift+u seguito dal codice



mercoledì 9 aprile 2014

Indice di un processore in Pantal

Le caratteristiche principali di un processore son la velocità (operazioni al secondo) e il numero di sottoprocessori (core).
Il pantal [P] è un' unità di misura che li raggruppa in un unico dato.

                        Pantal = core x GHz

Sapendo il pantal di un processore è facile stimarne le caratteristiche:
dividendo il numero di pantal per due (che sono i GHz medi di un processore attuale) si ottiene all' incirca il numero di core; sapendo che il numero di core è una potenza di due si arrotonda tale numero e di conseguenza si calcolano i GHz, per esempio:
             un processore da 7 P
             7 P : 2 GHz = 3,5 core -> 4 core
             7 P : 4 core = 1,75 GHz



Ecco alcuni valori di pantal:

processore                            GHZ          core                  Pantal
Intel i3-4000M                    2,40            2                       4,8
Intel i7-4810MQ                 2,80            4                       11,2
AMD Athlon II                   2,30            2                       4,6
                   

martedì 1 aprile 2014

[C++] Eserciti Galattici

L'esercito della Signoria è riuscito a costruire un'arma segreta: il temibile Sarcofago Nero. Esso legge una parola segreta S costituita da lettere minuscole dell'alfabeto: a, b, c, ..., z (ogni lettera può comparire zero, una o più volte).
Il Sarcofago Nero può assumere N configurazioni al suo interno, numerate da 1 a N. La parola segreta   viene accettata se raggiunge la configurazione finale (avente numero N) a partire dalla configurazione iniziale (avente numero 1) dopo aver letto tutte le lettere in S una alla volta. Per ogni configurazione I  del Sarcofago Nero, la tripletta (I,J,c) indica che la lettera c lo fa transitare dalla configurazione I alla configurazione J.
L'esercito rivale ha carpito una parola segreta S, ma non sa se è quella del Sarcofago Nero. Il tuo compito è quello di trovare la configurazione interna Q che esso raggiunge, dopo aver letto S, a partire dalla configurazione iniziale.

Dati di input
Il file  input.txt  è composto da M+2 righe. La prima riga contiene tre interi positivi separati da uno
spazio, che rappresentano il numero M delle triplette, il numero N di configurazioni e il numero K di
lettere nella sequenza S. La seconda riga contiene K lettere separate da uno spazio, le quali formano la
sequenza S. Ciascuna delle rimanenti M righe contiene due interi positivi I e J e una lettera c, separati da una spazio, che rappresentano la tripletta (I,J,c) per la transizione del Sarcofago Nero.
Dati di output
Il file  output.txt  è composto da una sola riga contenente il numero Q della configurazione raggiunta
dal Sarcofago Nero a partire dalla sua configurazione iniziale (avente numero 1), dopo aver letto tutta la
sequenza S.
Assunzioni
2 ≤ M ≤ 100.
2 ≤ N ≤ 100.
2 ≤ K ≤ 10.
1 ≤ Q ≤ N.

Esempi di input/output
File  input.txt      File  output.txt
5 3 6                    2
a a a b a b
1 3 a
1 2 b
2 1 a
3 2 b
3 3 a


Niente di più facile che modificare una variabile <Q> in base alle istruzioni memorizzate in un vettore trami te coppi char-int:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<vector>

#define K 10
#define N 100

using namespace std;

ifstream in;
ofstream out;

typedef pair<char,int> ci;

int m,n,k,q=1,t1,t2;
char s[K],t3;
vector<ci> ijc [N+1];

int main(){
in.open("input.txt");
out.open("output.txt");

in>>m>>n>>k;
 
for (int i=0;i<k;i++)
 in>>s[i];

for (int i=0;i<m;i++){
 in>>t1>>t2>>t3;
 ijc[t1].push_back(ci(t3,t2));}

for (int i=0;i<k;i++)
 for (int j=0; j< ijc[q].size();j++)
  if (ijc[q][j].first ==s[i])
   q= ijc[q][j].second;


out<<q;

return 0;}

[C++] Nanga

Durante la lunga scalata delle cime attorno al Nanga Parbat, Reinhold Messner riesce a trasmettere al
campo base, a intervalli regolari, solo il dislivello percorso rispetto all'ultima trasmissione. Se invia un
numero positivo P, allora è salito di P metri rispetto alla precedente trasmissione; se invia un numero
negativo ­P, allora è sceso di P metri rispetto alla precedente trasmissione; se infine invia P=0, non ha
cambiato altitudine. Messner parte dal campo base a 5000 metri.
I suoi collaboratori al campo base ricevono tali rilevamenti: aiutali a identificare l'altitudine che risulta
più frequentemente rilevata in questo modo.

Dati di input
Il file  input.txt  è composto da N+1 righe. La prima riga contiene l'intero positivo N, il numero dei
rilevamenti trasmessi da Messner. Ciascuna delle successive N righe contiene un intero che rappresenta
il dislivello percorso rispetto alla precedente trasmissione.
Dati di output
Il file  output.txt  è composto da una sola riga contenente l'altitudine che risulta più frequentemente
rilevata in questo modo dal campo base.

Assunzioni
2 ≤ N ≤ 1000.
­100 ≤ P ≤ 100.

Esempi di input/output
File  input.txt                   File  output.txt
8                                      5002
3
-1
6
-7
1
4
0
-4

Registriamo i risultati su un vettore, poi  cercheremo il massimo:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<cstdlib>
#include<iostream>
#include<fstream>

#define base 5000 //metri
#define N 10000
#define no -1

using namespace std;

ifstream in;
ofstream out;

int n,t,h=base,a[N][2],l=0,maxn=0,maxi;

int cerca (int k){
for (int i=0;i<l;i++)
 if (a[i][0]==k)
  return i;
return no;}

int main(){
in.open("input.txt");
out.open("output.txt");

in>>n;

for (int i=0;i<n;i++){
 in>>t;
 h+=t;
 t=cerca(h);
 if (t==no){
  a[l][0]=h;
  a[l++][1]=1;
 }else
  a[t][1]++;
}

for (int i=0;i<l;i++)
 if (a[i][1]>maxn){
  maxn =a[i][1];
  maxi=a[i][0];}

out<<maxi;

return 0;}

[C++] Domino

Sono date N tessere di domino, dove ogni tessera contiene due numeri compresi da 0 a 6 in
corrispondenza delle sue due estremità. Le tessere possono essere ruotate e la regola impone che due
tessere possono essere concatenate se le loro estremità in contatto hanno inciso lo stesso numero. Aiuta a
trovare il maggior numero di tessere che si possono concatenare a formare un'unica catena: non è detto
che si riescano sempre a usare tutte le tessere; inoltre, possono esserci due o più tessere uguali a meno di
rotazioni.

Dati di input
Il file  input.txt  è composto da N+1 righe. La prima riga contiene l'intero positivo N, il numero delle
tessere a disposizione. Ciascuna delle successive N righe contiene due interi positivi (compresi da 0 a 6)
separati da una spazio, che rappresentano i numeri incisi sulle estremità delle tessere.
Dati di output
Il file  output.txt  è composto da una sola riga contenente il massimo numero di tessere che possono
essere concatenate con le regole del domino.

Assunzioni
2 ≤ N ≤ 10.

Esempi di input/output
File  input.txt               File  output.txt
6                                   5
3 0
4 0
2 6
4 4
0 1
1 0

Il risultato è dato dalla somma delle metà di tutte le somme di presenze di un numero meno 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<cstring>

#define N 10

using namespace std;

ifstream in;
ofstream out;

int n, t1,t2,v[7],tes=1;

int main(){
in.open("input.txt");
out.open("output.txt");

in>>n;
 
memset(v,0,7);

for (int i=0; i<n;i++){
 in>>t1>>t2;
v[t1]++;
v[t2]++;
}

for (int i=0;i<7;i++){
 if (v[i]%2==1)
  v[i]--;
 tes+=v[i]/2;}

out<<tes;

return 0;}

[C++] Trovaparola

Luciano, patito di giochi di
tutti  i  tipi,  ha  ideato  un  nuovo  gioco,  che  funziona  nel  modo  seguente:  avete  una
griglia di caratteri e una parola da trovare nella griglia, partendo dalla cella in alto a
sinistra.  Le  uniche  mosse  consentite  sono  gli  spostamenti  a  destra  o  in  basso.  Ad
esempio, considerate la seguente griglia e la parola “olimpiadi”:

O L  I   V E N T
G Q M P W E R
G T  R  I  A Y E
 I  U  I  C D P E
A F  C O  I  G H
 J K X  C V R S
R O M  I  T A A
S  T  A N L E E

In  questo  caso,  la  sequenza  di  spostamenti  è  “DDBDBDBB”,  rappresentando  gli
spostamenti a destra con il carattere D e quelli in basso con il carattere B. Non esiste
nessuna soluzione, invece, se la parola da cercare è “olimpionico”. Il vostro compito
consiste nello scrivere un programma che, ricevute in ingresso una parola (da cercare)
e  una  griglia,  restituisca  la  sequenza  di  spostamenti,  qualora  esista  una  soluzione,
oppure stampi “ASSENTE”. Se dovessero esistere molteplici sequenze di spostamenti
corrette, è sufficiente stamparne una qualunque.
Dati di input
Il file input.txt è composto da 2+R righe. La prima riga contiene due interi positivi R e
C: le dimensioni della griglia, ovvero il numero di righe R e il numero di colonne C.
La  riga  successiva  contiene  P,  una  parola  da  cercare,  rappresentata  da  una  stringa
lunga  almeno  2  caratteri  (alfabetici  maiuscoli)  e  al  massimo  R+C­1  caratteri.  Le
rimanenti R righe del file contengono le righe della griglia, rappresentate da stringhe
di C caratteri alfabetici maiuscoli.
Dati di output
Il  file  output.txt  è  composto  da  una  sola  riga  contenente  una  stringa  di  testo:  la
sequenza  di  spostamenti  necessari  per  trovare  la  parola  nella  griglia,  se  la  parola  è
presente, oppure la stringa “ASSENTE” (senza le virgolette).
Assunzioni
• 2 ≤ R, C ≤ 100
Esempi di input/output
File input.txt                     File output.txt
8 7                                   DDBDBDBB
OLIMPIADI
OLIVENT
GQMPWER
GTRIAYE
IUICDPE
AFCOIGH
JKXCVRS
ROMITAA
STANLEE

File input.txt                             File output.txt
8 7                                            ASSENTE
OLIMPIONICO
OLIVENT
GQMPWER
GTRIAYE
IUICDPE
AFCOIGH
JKXCVRS
ROMITAA
STANLEE

Basta provare ad andare a destra e a sinistra con una funzione ricorsiva, arrivati alla fine si stampano i passaggi:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<cstdlib>
#include<iostream>
#include<fstream>
#include <string>

#define M 101
#define no "ASSENTE"

using namespace std;

ifstream in;
ofstream out;

bool t=true;
int r,c;
string p;
char g [M][M];

void cerca(int rr, int cc,string storia,int ch){
//prova a cercare la parola. Se non trova si ferma. Se trova stampa
if ( ++ch == p.length()){
 out<<storia;
t=false;
return;}
if (r>rr+1 && g [rr+1][cc]==p[ch])
 cerca (rr+1,cc,storia+"B",ch);
if (c>cc+1 && g [rr][cc+1]==p[ch])
 cerca (rr,cc+1,storia+"D",ch);
return;
}

int main(){
in.open("input.txt");
out.open("output.txt");

in>>r>>c>>p;
 
for (int i=0;i<r;i++)
 for (int j=0;j<c;j++)
  in>> g[i][j];

if (p[0]==g[0][0])
cerca (0,0,"",0);

if (t)
out<<no;

return 0;}

[C++] Gardaland

Nel 2012 le Olimpiadi Internazionali di Informatica (IOI) si sono svolte,
per  la  prima  volta,  in  Italia,  a  Sirmione.  Come  da  tradizione,  nella
giornata tra le due gare i concorrenti sono andati a divertirsi in un parco
giochi, in questo caso, Gardaland. La mattina di quel giorno decine di
pullman hanno prelevato i quattro ragazzi che costituiscono la squadra
olimpica  di  ciascuna  nazione  dal  Garda  Village,  dove  erano  stati
alloggiati,  e  li  hanno  portati  a  Gardaland.  Come  sempre  negli
spostamenti,  le  varie  nazioni  erano  state  ripartite  a  blocco  unico  tra  i
pullman, ossia tutti gli atleti di una stessa nazione trovavano posto su
uno  stesso  pullman.  Per  esempio,  sul  pullman  dell’Italia  viaggiavano
anche  Giappone,  Israele  e  Irlanda.  Al  ritorno  però,  come  sempre
succede alle IOI, dopo una giornata in un parco giochi i ragazzi hanno
fatto amicizia tra di loro, e al momento di tornare sui pullman sono saliti
alla rinfusa. Grazie al lavoro delle guide, per ogni pullman è stata stilata
una lista contenente, per ogni nazione, il numero di ragazzi a bordo. Il
vostro  compito  è  quello  di  aiutare  Monica,  responsabile
dell’organizzazione,  a  capire  se  i  pullman  possono  partire,  ovvero  se
tutti  i  quattro  ragazzi  di  ogni  nazione  che  sono  arrivati  a  Gardaland
sono saliti sui pullman. In caso contrario, dovete segnalare a Monica in
quanti mancano all’appello, divisi per nazioni.

Dati di input
Il file input.txt è composto da 1+N+L righe. La prima riga contiene due
interi  positivi  separati  da  uno  spazio:  il  numero  N  delle  nazioni  e  il
numero  L  di  righe  contenenti  informazioni  su  chi  è  attualmente  già
salito  sui  pullman.  (Ciascuna  nazione  verrà  qui  rappresentata  con  un
intero  compreso  tra  0  e  N­1).  Ognuna  delle  successive  N  righe
contiene un intero positivo: nella riga i+1 (con i >= 1) troviamo il numero
totale  di  ragazzi  della  nazione  i­1.  Ciascuna  delle  rimanenti  L  righe
contiene  due  interi  positivi:  un  intero  compreso  tra  0  e  N­1  che
rappresenta la nazione, e un intero positivo che specifica quanti ragazzi
di  quella  nazione  sono  su  un  certo  pullman.  Ovviamente  una  stessa
nazione può comparire diverse volte nelle L righe, e più precisamente
compare  su  tante  righe  quanti  sono  i  pullman  ospitanti  atleti  di  quella
nazione.
Dati di output
Il file output.txt è composto da una sola riga contenente l’intero 0 (zero)
se  non  manca  alcun  ragazzo.  Altrimenti,  il  file  contiene  1+C  righe:  la
prima riga contiene un intero C, ovvero il numero di nazioni che hanno
ragazzi ancora a Gardaland. Le restanti C righe contengono due interi:
l’identificativo della nazione e il numero di ragazzi di quella nazione che
non  sono  ancora  saliti  su  alcun  pullman.  E’  necessario  stampare  le
nazioni nell’ordine in cui sono state lette, ovvero in ordine crescente in
base all’identificativo.

Assunzioni
2 ≤ N ≤ 100
N ≤ L ≤ 1000

Contrariamente alle olimpiadi di informatica reali, dove gareggiano (massimo) 4 ragazzi per ogni nazione, nei casi di input si assume che ogni nazione abbia al massimo 100 ragazzi, e almeno 1 ragazzo.
 Quindi, indicando con Ri il numero
di ragazzi della i­esima nazione, vale sempre 1 ≤ Ri ≤ 100.

Esempi di input/output
File input.txt               File output.txt
3 5                              2
4                                 0 1
4                                 2 1
3
0 2
1 3
0 1
2 2
1 1
File input.txt         File output.txt
3 6                        0
4
4
4
0 2
1 3
2 1
0 2
2 3
1 1

Basta contare quanti ragazzi non sono sugli autobus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<cstdlib>
#include<iostream>
#include<fstream>

using namespace std;

ifstream in;
ofstream out;

int n,l,t1,t2,persi=0;

int main(){
in.open("input.txt");
out.open("output.txt");

in>>n>>l;

int rag[n];

for (int i=0;i<n;i++)
 in>>rag[i];

for (int i=0;i<l;i++){
in>>t1>>t2;
rag[t1]-=t2;
}
 
for (int i=0;i<n;i++)
 if(rag[i]>0)
  persi++;

out<<persi;

for (int i=0;i<n;i++)
 if(rag[i]>0)
  out<<"\n"<<i<<" "<<rag[i];

return 0;}

[C++] Brisbane

Nel 2013, le IOI si svolgeranno a Brisbane (in Australia). La rappresentativa italiana
ha  già  iniziato  a  studiare  la  città,  per  capire  cosa  ci  sia  di  interessante  da  vedere,  e
come  ci  si  possa  spostare  nella  giornata  libera  successiva  alla  seconda  gara  delle
Olimpiadi. L’offerta di trasporto pubblico a Brisbane è abbastanza variegata: ci sono
due linee di bus, di cui una gratuita che gira intorno alla città, e due linee di traghetti
che fermano in diversi punti del fiume Brisbane, che taglia la città in due; per quello
che  riguarda  i  prezzi,  esiste  un  abbonamento  giornaliero  a  tutti  i  trasporti  pubblici,
bus e traghetti insieme, oppure è possibile prendere un più economico abbonamento
giornaliero ai soli traghetti, o un ancor più economico abbonamento ai soli bus.
La  squadra  italiana  vorrà  visitare  il  maggior  numero  di  attrazioni  possibile  e  per
questo  motivo  Monica,  la  responsabile  dell’organizzazione,  ha  deciso  di  cercare  un
buon  compromesso  tra  il  prezzo  dei  biglietti  e  le  attrazioni  che  sarà  possibile
raggiungere  partendo  dall’hotel.  Data  una  lista  di  attrazioni  e  la  mappa  dei
collegamenti delle diverse linee del trasporto pubblico, il vostro compito è quello di
aiutare Monica a capire quante attrazioni sono raggiungibili per ogni possibile scelta
dei biglietti per i trasporti pubblici.
Per esempio, possiamo fare riferimento alla figura qui a destra, dove ad ogni fermata è
associato un cerchio (o un quadrato nel caso di luogo di attrazione) e i collegamenti
sono:
tratteggiati – collegamenti gratuiti (bus gratuiti e brevi percorsi a piedi);
rossi – bus a pagamento;
gialli – traghetto.
Il punto di partenza della rappresentativa italiana è la fermata numero 0; le attrazioni
da vedere sono quelle rappresentate con un quadrato, numerate rispettivamente 8, 12,
15, 22 e 28. Come si può vedere, spostandosi con i mezzi gratuiti si raggiungono solo
due  attrazioni  (la  numero  8  e  la  numero  14);  comprando  il  biglietto  del  bus  si
raggiungono  tutte  le  attrazioni;  comprando  il  biglietto  del  traghetto  si  raggiungono,
oltre alla 8 e la 14, anche la 12 e la 15 per un totale di quattro attrazioni. Il biglietto
combinato, in questo caso, raggiunge tutte le attrazioni.

Dati di input
Il file input.txt è composto da 1+A+Mg+Mb+Mt righe. La prima riga contiene cinque
interi positivi separati da uno spazio, che rappresentano il numero N delle fermate, il
numero  A  di  attrazioni,  il  numero  Mg  dei  collegamenti  gratuiti,  il  numero  Mb  dei
collegamenti  via  bus  e  il  numero  Mt dei collegamenti via traghetto. Ogni fermata è
rappresentata da un intero compreso tra 0 e N­1. Le successive A righe  contengono
ognuna  una  fermata  (un  intero  compreso  tra  0  e  N­1)  corrispondente  ad  una  delle
attrazioni  che  la  rappresentativa  italiana  può  visitare.  Ognuna  delle  successive
Mg+Mb+Mt righe contiene un collegamento del trasporto pubblico, rappresentato da
due interi positivi: le fermate collegate. Le prime Mg righe contengono i collegamenti
gratuiti  (bus  gratuiti  e  brevi  percorsi  a  piedi),  poi  le  successive  Mb  contengono  i
collegamenti  del  bus  a  pagamento  e  infine  le  ultime  Mt  righe  contengono  i
collegamenti  dei  traghetti.  Il  punto  di  partenza  della  rappresentativa  italiana  è  la
sempre la fermata numero 0.
Dati di output
Il file output.txt è composto da 4 righe contenenti ognuna un intero non negativo,
rispettivamente, il numero di attrazioni raggiungibili:
1.  senza comprare biglietti (solo con mezzi gratis);
2.  comprando solo il biglietto giornaliero dei bus;
3.  comprando solo il biglietto giornaliero dei traghetti;
4.  comprando entrambe le tipologie di biglietti.

Assunzioni
• 2 ≤ N ≤ 1000
• N ≤ Mg+Mb+Mt ≤ 10000

Esempi di input/output
File input.txt                 File output.txt
6 2 2 4 2                         1
1                                 1
5                                 2
0 1                               2
2 5
0 3
1 3
2 4
4 5
1 2
3 4 1

File input.txt  (corrisponde alla figura)  File output.txt
30 5 18 14 11                                          2
8                                                      5
12                                                     4
15                                                     5
22  
28
0 5
0 24
1 8
1 25
2 3
2 23
5 11
8 14
11 16
13 17
14 19
16 20
18 22
19 21
20 22
21 22
23 24
23 25
1 4
2 28
2 29
4 7
4 8
7 29
12 26
14 15
15 19
15 21
17 21
18 21
26 27
27 28
3 7
3 25
6 9
6 13
7 15
9 10
10 17
12 16
12 18
13 15
17 18

Qui bisogna scrivere le città nei grafi {gratis, col bus, col treno, tutti} e contare per ogni grafo quante tappe si possono raggiungere.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<cstring>

#define M 10000

using namespace std;

ifstream in;
ofstream out;

int n,a,cg,cb,ct,t1,t2,tg=0,tb=0,tt=0,tc=0;

vector<int> vg[M];
vector<int> vb[M];
vector<int> vt[M];
vector<int> vc[M];

int attr[M];
bool vis[M];


void gg(int k){
//esplora il grafo gratuito e somma le fermate con punti di attrazione
vis[k]=false;
if (binary_search(attr,attr+a,k))
 tg++;
for (int i=0;i<vg[k].size();i++)
 if(vis[vg[k][i]])
  gg(vg[k][i]);}
void gb(int k){
//esplora il grafo bus e somma le fermate con punti di attrazione
vis[k]=false;
if (binary_search(attr,attr+a,k))
 tb++;
for (int i=0;i<vb[k].size();i++)
 if(vis[vb[k][i]])
  gb(vb[k][i]);}
void gt(int k){
//esplora il grafo treno e somma le fermate con punti di attrazione
vis[k]=false;
if (binary_search(attr,attr+a,k))
 tt++;
for (int i=0;i<vt[k].size();i++)
 if(vis[vt[k][i]])
  gt(vt[k][i]);}
void gc(int k){
//esplora il grafo combinato e somma le fermate con punti di attrazione
vis[k]=false;
if (binary_search(attr,attr+a,k))
 tc++;
for (int i=0;i<vc[k].size();i++)
 if(vis[vc[k][i]])
  gc(vc[k][i]);}


int main(){
in.open("input.txt");
out.open("output.txt");

in>>n>>a>>cg>>cb>>ct;

for (int i=0;i<a;i++)
 in>>attr[i];
sort(attr,attr+a);
for (int i=0;i<cg;i++){
 in>>t1>>t2;
 vg[t1].push_back(t2);
 vb[t1].push_back(t2);
 vt[t1].push_back(t2);
 vc[t1].push_back(t2);
 vg[t2].push_back(t1);
 vb[t2].push_back(t1);
 vt[t2].push_back(t1);
 vc[t2].push_back(t1);
 }
for (int i=0;i<cb;i++){
 in>>t1>>t2;
 vb[t1].push_back(t2);
 vc[t1].push_back(t2);
 vb[t2].push_back(t1);
 vc[t2].push_back(t1);
 }
for (int i=0;i<ct;i++){
 in>>t1>>t2;
 vt[t1].push_back(t2);
 vc[t1].push_back(t2);
 vt[t2].push_back(t1);
 vc[t2].push_back(t1);
 }
 


memset(vis,true,n);
gg(0);
memset(vis,true,n);
gb(0);
memset(vis,true,n);
gt(0);
memset(vis,true,n);
gc(0);


out<<tg<<"\n"<<tb<<"\n"<<tt<<"\n"<<tc;

return 0;}

[C++] Zig Zag

Una sequenza viene detta una sequenza a zig-zag se i valori delle differenze tra numeri successivi si alterna tra valori positivi e valori negativi. La prima differenza può essere negativa 0 positiva, se è negativa quella dopo deve essere positiva, se è positiva quella dopo deve essere negativa e così via. Una sequenza con meno di due elementi è anche una sequenza a zigzag. Ti viene data una sequenza di numeri, tu puoi decidere di eliminare quanti numeri vuoi dalla sequenza in modo che i numeri rimanenti formino una sequenza a zigzag. Trovare la sequenza a zigzag più lunga che è possibile ottenere e stampare la sua lunghezza.

Input
Il programma deve leggere dal file : la prima riga contiene un intero N. La seconda riga contiene N valori positivi, i valori della sequenza di partenza.
Output
Il programma deve scrivere nel file la risposta al problema.

Assunzioni
1 ≤ N ≤ 800

Esempio
input output
10 7
1 17 5 10 13 15 10 5 16 8


Basta sfogliare la sringa ed eliminare tutti gli "errori" che si incontrano:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <cstdlib>
#include <iostream>
#include<fstream>

using namespace std;

ifstream in;
ofstream out;

int n;

     
int iz(int *c, int n){
     bool positive;
     int nc=n;
     positive= (c[0]-c[1] < 0);
     for (int i=0;i<n-1;i++){
     int d=c[i]-c[i+1];
      if (d==0||(d<0 && !positive)||(d>0 && positive))
         nc--;
      else
      positive= (d > 0);
         }
      return nc;
     }
 
 


int main()
{   in.open("input.txt");
    out.open("output.txt");
    
in>>n;
int c [n]; 
for (int i=0;i<n;i++)
    in>>c[i];
    
if (n<2)
   out<<1;

        
else 
out << iz(c,n);

    return 0;
}

[C++] Ristorante

Edoardo possiede un ristorante per al massimo N persone. L’entrata del ristorante ha un guardaroba con N appendini. Ogni cliente può usare un appendino del guardaroba per metterci le proprie giacche. Utilizzare l’iesimo gancio ha un costo ai in euro. Ogni persona può utilizzare al massimo un gancio.
Stasera Edoardo si aspetta di ricevere M clienti al ristorante. Naturalmente ogni cliente vorrà utilizzare gli appendini con il costo minimo (se ce ne sono di più con lo stesso costo, ne prenderà uno a caso tra questi). Purtroppo, se nel momento in cui un cliente arriva non ci sono appendini disponibili, Edoardo deve pagare una multa di D euro al cliente.
Aiuta Edoardo a trovare il profitto in euro (può anche essere negativo) che avrà questa sera per quanto riguarda il guardaroba. Puoi assumere che prima che i clienti arrivino tutti gli appendini siano disponibili e che nessun altro a parte gli m clienti visiterà il ristorante.

Input
Il programma deve leggere da un file di nome “input.cxt”. La prima riga contiene due interi N e D.
La riga successiva contiene N interi, cioè a1, a2, ..., aN. La terza riga contiene l’intero M.

Output
Il programma deve stampare sul file la risposta al problema.

Assunzioni
1 ≤ N ≤ 100.000
1 ≤ M ≤ 200.000
1 ≤ ai ≤ 1000
1 ≤ D ≤ 2000

Esempio
input output
2 1 -5
2 1
1 0

Ordinati i prezzi in ordine crescente li prendiamo tutti in ordine, finiti sottraiamo al profitto la multa:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <cstdlib>
#include <iostream>
#include<fstream>
#include<algorithm>

using namespace std;

ifstream in;
ofstream out;

int n,d,m,profitto;

int main()
{   in.open("input.txt");
    out.open("output.txt");
    
in >> n>>d;
int prezzi[n];
for (int i=0;i<n;i++)
    in>>prezzi[i];
in>>m;

profitto=0;
sort(prezzi,prezzi+n);

for (int i=0;i<m;i++)
    if(i<n)
           profitto+=prezzi[i];
    else
        profitto-=d;
        
out<<profitto;

    return 0;
}