Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<fstream>
- #include<set>
- #include<deque>
- using namespace std;
- multiset <int> A;
- int filiale(int dist, int f, multiset <int> m) //controllo se la distanza dist puo andare bene, (->-1 se dist è troppo alto, altrimenti->distaza minima)
- {
- deque < int > code; //contiene le citta scelte con questa distanza
- int high=*m.rbegin(), low=*m.begin(); //high rappresenta l ultima, low la prima
- code.push_back(low); //scelgo sicuramente la prima
- low+=dist; //low va poi a rappresentare la citta da cercare a distanza dist
- for(int i=0;i<f-2;i++) // per tutte le filiali che mi mancano(escluse la prima e l ultima)
- {
- if(*m.upper_bound(low)-dist < dist-*m.lower_bound(low) && low<high) //controllo se è piu vicina alla mia distanza ideale la citta con distanza maggiore o minore di low
- code.push_back(*m.upper_bound(low)); //aggiungo la piu vinica
- else code.push_back(*m.lower_bound(low)); //^
- low+=dist; //aggiorno la mia distanza
- }
- code.push_back(high); //scelgo anche l'ultimo
- if(code[code.size()-1]==code[code.size()-2])//se la distanza è troppo elevata gli ultimi due valori corrispondono
- return -1;
- else{
- int min_dist=code[1]-code[0]; //cerco la distanza minima tra la città scelte
- for(int i=2;i<code.size();i++)
- if(code[i]-code[i-1]<min_dist)
- min_dist=code[i]-code[i-1];
- return min_dist;
- }
- }
- int main()
- {
- ifstream in("input.txt");
- ofstream out("output.txt");
- int n,f,tmp,max_solution;
- for(int i=0;i<n;i++)
- {
- in>>tmp;
- A.insert(tmp);
- }
- max_solution=(*A.rbegin()-*A.begin())/(f-1); //rappresenta il valore massimo che può essere trovato, quindi nel caso in cui esistano F città equidistanti fra la prima e l'ultima
- int min=1, max=max_solution, mid=max/2, solution=0;
- while (min < max)
- {
- int ris=filiale(mid, f, A); //se la distanza dist va bene allora provo a migliorarla
- if (ris!=-1)
- {
- min = mid + 1;
- if(ris>solution)
- solution=ris;
- }
- else max = mid - 1; //altrimenti la diminuisco
- mid = (min + max) / 2;
- }
- out<<solution;
- }
Advertisement
Add Comment
Please, Sign In to add comment