Se consideră N
intervale [Ai,Bi]
, 1 ≤ i ≤ N
disjuncte.
Tuturor intervalelor li se aplică o operație de extindere la ambele capete cu o valoare naturală x
, astfel încât după extindere cu valoarea x
, intervalul [Ai,Bi]
va deveni intervalul [Ai-x,Bi+x]
, 1 ≤ i ≤ N
.
După extindere, spunem că intervalele [Ai,Bi]
și [Aj,Bj]
aparțin aceluiași grup de intervale dacă ele se intersectează sau dacă există un interval [Ak,Bk]
astfel încât [Ai,Bi]
se intersectează cu [Ak,Bk]
iar intervalele [Ak,Bk]
, [Aj,Bj
] aparțin aceluiași grup de intervale.
Cerința
Să se determine valoarea minimă x
cu care vor trebui să fie extinse toate intervalele astfel încât să se formeze un grup cu cel puțin P
intervale.
Date de intrare
Fișierul de intrare intervale3.in
conține pe prima linie numerele naturale N
și P
cu semnificația din enunț. Pe următoarele N
linii sunt descrise cele N
intervale, câte un interval pe linie. Pentru fiecare interval i
sunt specificate capetele sale Ai
şi Bi
.
Date de ieșire
Fișierul de ieșire intervale3.out
va conţine pe prima linie numărul natural x
ce reprezintă valoarea minimă cu care vor trebui extinse intervalele astfel încât să se obțină cel puțin un grup format din cel minimum P
intervale.
Restricții și precizări
2 ≤ N ≤ 100 000
-1 400 000 000 ≤ Ai < Bi ≤ 1 400 000 000
2 ≤ P ≤ N
- Două intervale se intersectează dacă au cel puţin un punct comun
- Pentru
30%
dintre testeN ≤ 10 000
Exemplu
intervale3.in
7 3 8 9 21 25 14 17 1 4 28 32 35 42 100 200
intervale3.out
2
Explicație
După extinderea cu 2
a celor 7
intervale se obțin intervalele:
[6,11]
[19,27]
[12,19]
[-1,6]
[26,34]
[33,44]
[98,202]
Se formează astfel 3
grupuri de intervale:
- Grupul 1:
[-1,6], [6,11]
- Grupul 2:
[12,19], [19,27], [26,34], [33,44]
- Grupul 3:
[98,202]
Grupul 2
este format din cel puțin 3
intervale.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Intervale3:
/*
sol Eugen Nodea - cautare binara
*/
# include <cstdio>
# include <algorithm>
# define NMax 100003
using namespace std;
struct interval
{
int a, b;
} v[NMax];
int i, N, P;
long long s, d, m;
bool cmp (interval x, interval y)
{
if (x.a > y.a) return false;
return true;
}
inline int intersectie(interval x, interval y, long long m)
{
if ((x.b + m < y.a - m )|| (y.b + m < x.a - m)) return 0;
return 1;
}
bool este (long long x)
{
int i, nr = 1;
for (i = 1; i<N; ++i)
{
if (intersectie(v[i], v[i+1], x))
{
++nr;
if (nr >= P) return true;
}
else nr = 1;
}
return false;
}
int main()
{
freopen ("intervale3.in", "r", stdin);
freopen ("intervale3.out", "w", stdout);
scanf("%d %d", &N, &P);
for (i=1; i<=N; ++i)
scanf("%d %d", &v[i].a, &v[i].b);
sort(v + 1, v + N + 1, cmp);
s = 1; d = 1500000000;
while (s <= d)
{
m = s + ((d - s) >> 1);
if (este(m)) d = m - 1;
else s = m + 1;
}
printf("%lld
", s);
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #699 Intervale3
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #699 Intervale3 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!