Cerinţa
Gigel este un cântăreț începător. El știe deja să cânte n
melodii, și pentru fiecare melodie se cunoaște durata, exprimată în minute și secunde. Gigel va participa la o emisiune de televiziune, unde va putea cânta timp de T
secunde. El vrea să cânte cât mai multe melodii, pentru a-și demonstra talentul deosebit.
Ajutați-l să aleagă piesele pentru emisiune, și vă va răsplăti cu un autograf.
Date de intrare
Fişierul de intrare concert.in
conţine pe prima linie numerele n T
. Fiecare dintre următoarele n
linii conține durata unei melodii, în formatul m:s
, unde m
și s
pot avea una sau două cifre.
Date de ieşire
Fişierul de ieşire concert.out
va conţine pe prima linie numărul M
, reprezentând numărul maxim de melodii care pot fi alese. Următoarea linie va conține M
numere între 1
și n
, reprezentând numărul de ordine al melodiilor alese, așa cum sunt ele date în fișierul de intrare.
Restricţii şi precizări
1 ≤ n ≤ 100
1 ≤ T ≤ 1000
0 ≤ m ≤ 10
0 ≤ s ≤ 59
Exemplu
concert.in
7 450 2:30 1:45 2:10 03:00 01:15 02:05 2:05
concert.out
4 2 5 6 7
Explicație
În 450
de secunde se pot cânta maxim 4
melodii, de exemplu cele numerotate cu: 2 5 6 7
.
#include <bits/stdc++.h> using namespace std; ifstream cin("concert.in"); ofstream cout("concert.out"); int n , timp , s[101] , cnt; char v[10]; struct poz { int t , ind; }x[101]; int comp(poz a , poz b) { if(a.t <= b.t)return 1; else if(a.t == b.t && a.ind < b.ind) return 1; else return 0; } int main() { cin >> n >> timp; for(int i = 1 ; i <= n ; i++) { cin >> v; int j = 0 , a = 0 , b = 0; while(v[j] != ':') a = a * 10 + v[j++] - '0'; a *= 60; j++; while(v[j] != '\0') b = b * 10 + v[j++] - '0'; a += b; x[i].t = a; x[i].ind = i; } sort(x + 1 , x + n + 1 , comp); int i = 1; while(i <= n && x[i].t <= timp) { s[++cnt] = x[i].ind; timp -= x[i].t; i++; } cout << cnt << '\n'; for(int i = 1 ; i <= cnt ; i++) cout << s[i] << " "; return 0; }