Informatică, întrebare adresată de katanau26, 8 ani în urmă

Problema credite (#2150) pbinfo


Maria este studentă în anul I la facultatea de informatică și a primit o listă de N probleme, numerotate de la 1 la N, pe care trebuie să le rezolve la cursul de algoritmică, rezolvarea unei probleme durând exact o unitate de timp. Pentru că profesorul vrea să testeze capacitatea elevilor de a a face cele mai bune alegeri, pentru fiecare problemă acesta a stabilit numărul de credite (Ci) pe care studentul le va primi dacă rezolvă problema i, dar și un număr limită de unități de timp (Ti) până la care problema poate fi rezolvată.
Cerința

Cunoscând numărul de probleme, numărul de credite al fiecărei probleme precum și timpul limită de rezolvare al fiecărei probleme, scrieți un algoritm care determină numărul maxim de credite pe care le poate obține Maria.
Date de intrare

Pe prima linie a fișierului de intrare credite.in se găsește un număr natural N, reprezentând numărul de probleme de pe listă.
Pe următoarele N linii din fișierul de intrare vor fi datele despre fiecare problemă, pe linia i+1 găsindu-se 2 numere naturale Ci și Ti care reprezintă numărul de credite, respectiv timpul limită pentru problema i.
Date de ieșire

În fișierul credite.out se va afișa un singur număr natural, reprezentând numărul maxim de credite pe care Maria le poate obține.
Restricții și precizări

2 ≤ n ≤ 10000
2 ≤ Ci ≤ 1000
1 ≤ Ti ≤ 10000


Exemplu

credite.in

4
10 3
7 5
8 1
2 1

credite.out

25

Răspunsuri la întrebare

Răspuns de CinevaFaraNume
4

#include <fstream>

#include <algorithm>

using namespace std;

struct Probl{

   int T;

   int C;

   bool seFace = false;

};

bool cmp(Probl a, Probl b){

   if(a.C == b.C)

       return a.T < b.T;

   else return a.C > b.C;

}

Probl vec[10001];

bool timp[100000];

int main(){

   ifstream fin("credite.in");

   ofstream fout("credite.out");

   int n;

   fin >> n;

   for(int i = 0; i < n; i++){

       fin >> vec[i].C >> vec[i].T;

   }

   fin.close();

   sort(vec, vec+n, cmp);

   int total = 0;

   for(int i = 0; i < n; i++){

       int t = vec[i].T;

       if(!timp[t]){

           timp[t] = true;

           vec[i].seFace = true;

       }else{

           int j;

           for(j = t-1; j>0; j--){

               if(!timp[j])

                   break;

           }

           if(j != 0){

               timp[j] = true;

               vec[i].seFace = true;

           }

       }

   }

   for(int i = 0; i < n; i++)

       if(vec[i].seFace)

           total += vec[i].C;

   fout << total;

   fout.close();

}

Alte întrebări interesante