După ce și-a cumpărat biscuiți, Costy, eroul nostru, ajunge acasă și se apucă de teme. Astfel, dă peste următoarea problemă:
“La o probă de maraton participă N maratonişti. Ştiind că la secunda 0, un maratonist se află la Xi metri de linia de sosire și aleargă cu o viteză de Yi metri/secundă, să se răspundă la Q întrebări de tipul:
Câți maratonişti au trecut linia de sosire după Qi secunde ? “
Cerința
Ajutați-l pe Costy să răspundă la cele Q întrebări.
Date de intrare
Fișierul maraton.in conține:
pe prima linie numărul N, reprezentând numărul de maratoniști;
pe următoarele N linii, câte 2 numere, Xi Yi, reprezentând distanța fată de linia de sosire și viteza fiecărui maratonist;
pe următoarea linie, numărul Q reprezentând numărul de întrebări;
pe următoarele Q linii se află câte un număr Qi reprezentând întrebarea i;
Date de ieșire
Fișierul de ieșire maraton.out conţine:
Q linii, linia i reprezentând răspunsul la întrebarea i;
Restricții și precizări
1 <= N, Q, Qi, Xi <= 100 000
1 <= Yi <= 1000
Exemplu
maraton.in
5
100 4
12 3
101 5
20 1
44 7
4
20
12
7
21
maraton.out
3
2
2
4
Explicație
La secunda 20 au trecut linia de sosire maratoniștii cu indicii 2, 4, 5.
La secunda 12 au trecut linia de sosire maratoniștii cu indicii 2, 5.
La secunda 7 au trecut linia de sosire maratoniștii cu indicii 2, 5.
La secunda 21 au trecut linia de sosire maratoniștii cu indicii 2, 3, 4, 5.
Răspunsuri la întrebare
#include <fstream>
#include<algorithm>
using namespace std;
ifstream fin("maraton.in");
ofstream fout("maraton.out");
int main()
{
int a[100001], n, q, mr, v, p;
fin >> n;
for(int i = 1; i <= n; ++i){
fin >> mr >> v;
if(mr % v == 0)
a[i] = mr / v;
else
a[i] = mr / v + 1;
}
sort(a + 1, a + n + 1);
fin >> q;
for(int i = 1; i <= q; ++i){
int x;
fin >> x;
if(a[n] <= x)
fout << n << '\n';
else if(a[1] > x)
fout << 0 << '\n';
else{
int st = 1, dr = n, p;
while(st <= dr){
int mij = (st + dr) / 2;
if(a[mij] <= x){
p = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
fout << p << '\n';
}
}
return 0;
}
Am folosit cautarea binara pentru a rezolva aceasta problema.
mr = metri ramasi
v = viteza
Daca ai nelamuriri, ma poti intreba!
P.S. A luat 100 de pct. pe PbInfo.
dar o las pe mâine.. poate caut unde se poate câștiga din timp...
dacă te interesează la acest nivel, pot pune răspunsul ...
Cu bine!