Kružne zone – rešenje
Postavka
Meta se sastoji od n kružnih zona oko koordinatnog početka. Prva zona je krug, a svaka sledeća je kružni prsten oko prethodne. Zadate su širine zona redom od centra ka spolja. Za svaku od m tačaka (x, y) ispiši redni broj zone u kojoj se nalazi (zone se broje od 0) ili izvan ako je tačka van svih zona. Tačka na granici dve zone pripada unutrašnjoj zoni.
Ulaz: broj n, zatim n širina; broj m, zatim m parova koordinata (n, m ≤ 50 000).
Napomena: postavka je zapisana na osnovu postojećeg rešenja zadatka.
Primer
Ulaz
3
1 2 3
5
0 0
1 0
2 2
5 0
6 1Izlaz
0
0
1
2
izvanRešenje (C++)
Ideja je objašnjena u uputstvu: iz širina se računaju granice zona, a za svaku tačku binarnom pretragom (lower_bound) nalazi prva granica koja nije manja od rastojanja tačke.
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n;
vector<double> r(n); // r[i] = poluprečnik spoljne granice zone i
double p = 0;
for (int i = 0; i < n; i++) {
double sirina;
cin >> sirina;
p += sirina; // poluprečnik = zbir širina do te zone
r[i] = p;
}
cin >> m;
for (int k = 0; k < m; k++) {
double x, y;
cin >> x >> y;
double R = sqrt(x * x + y * y); // rastojanje od centra
int z = lower_bound(r.begin(), r.end(), R) - r.begin(); // prva granica >= R
if (z == n) cout << "izvan" << endl;
else cout << z << endl;
}
return 0;
}
R > 0. Sa lower_bound takav poseban slučaj ne postoji."KRUŽNE ZONE" - REŠENJE ZADATKA
Oblast: binarna pretraga, sortiranje niza
#include <iostream>#include<math.h>
using namespace std;
#define DIMN 50000
#define DIMM 50000
int main()
{
int n,m;
double r[DIMN+1],sir=0,p=0;
double X[DIMM+1],Y[DIMM+1];
cin>>n;
for(int i=0; i<n; i++)
{
cin>>sir;
r[i]=p+sir;// data je sirina zona, a pamtimo poluprecnike koncentricnih krugova
p=r[i];
}
cin>>m;
for(int i=0; i<m; i++)
{
cin>>X[i]>>Y[i];
}
for(int i=0; i<m; i++)
{
int l=0;
int d=n-1;
int poz=0;
bool nadjen=false;
while(l<=d)
{
int s=(l+d)/2;
double R2;
R2=X[i]*X[i]+ Y[i]*Y[i];// kvadrat rastojanja
double R=sqrt(R2);//rastojanje
double rP=0;
/*Odredjuje prethodni poluprecnik*/
if(s-1<0)//ako je s pocetni index onda je manji krug prstena poluprecnika jednakim nuli
{
rP=0;
}
else{
rP=r[s-1];
}
/*da li pripada zoni*/
if(R>rP && R<=r[s])
{
nadjen=true;
poz=s;
break;
}
else if(R<rP)
{
d=s-1;
}
else
{
l=s+1;
}
}
if(nadjen)
{
cout<<poz<<endl;
}
else
{
cout<<"izvan"<<endl;
}
}
return 0;
}
