Guest User

Untitled

a guest
Jul 20th, 2017
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. #include<fstream>
  2. #include<set>
  3. #include<deque>
  4. using namespace std;
  5. multiset <int> A;
  6. 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)
  7. {
  8. deque < int > code; //contiene le citta scelte con questa distanza
  9. int high=*m.rbegin(), low=*m.begin(); //high rappresenta l ultima, low la prima
  10. code.push_back(low); //scelgo sicuramente la prima
  11. low+=dist; //low va poi a rappresentare la citta da cercare a distanza dist
  12. for(int i=0;i<f-2;i++) // per tutte le filiali che mi mancano(escluse la prima e l ultima)
  13. {
  14. 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
  15. code.push_back(*m.upper_bound(low)); //aggiungo la piu vinica
  16. else code.push_back(*m.lower_bound(low)); //^
  17. low+=dist; //aggiorno la mia distanza
  18.  
  19. }
  20. code.push_back(high); //scelgo anche l'ultimo
  21. if(code[code.size()-1]==code[code.size()-2])//se la distanza è troppo elevata gli ultimi due valori corrispondono
  22. return -1;
  23. else{
  24. int min_dist=code[1]-code[0]; //cerco la distanza minima tra la città scelte
  25. for(int i=2;i<code.size();i++)
  26. if(code[i]-code[i-1]<min_dist)
  27. min_dist=code[i]-code[i-1];
  28. return min_dist;
  29. }
  30. }
  31.  
  32.  
  33. int main()
  34. {
  35. ifstream in("input.txt");
  36. ofstream out("output.txt");
  37. int n,f,tmp,max_solution;
  38. for(int i=0;i<n;i++)
  39. {
  40. in>>tmp;
  41. A.insert(tmp);
  42. }
  43. 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
  44. int min=1, max=max_solution, mid=max/2, solution=0;
  45. while (min < max)
  46. {
  47. int ris=filiale(mid, f, A); //se la distanza dist va bene allora provo a migliorarla
  48. if (ris!=-1)
  49. {
  50. min = mid + 1;
  51. if(ris>solution)
  52. solution=ris;
  53. }
  54. else max = mid - 1; //altrimenti la diminuisco
  55. mid = (min + max) / 2;
  56. }
  57. out<<solution;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment