vlatkovski

Zaljubeni (Zalubeni) (NEDOVERSENO)

Jun 15th, 2017
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3.  
  4. using namespace std;
  5.  
  6. int main() {
  7.     int m, n, e_desno, e_levo, l;
  8.     cin >> m >> n >> e_desno >> e_levo >> l;
  9.  
  10.     set<int> b;
  11.  
  12.     for (int i = 0; i < l; ++i) {
  13.         int x;
  14.         cin >> x;
  15.         b.insert(x);
  16.     }
  17.  
  18.     set<int>::iterator vesna = b.find(m), krste = b.find(n);
  19.  
  20.     bool nemaStanicaV = vesna == b.end(), nemaStanicaK = krste == b.end();
  21.     if (nemaStanicaV) {
  22.         b.insert(m);
  23.         vesna = b.find(m);
  24.     }
  25.     if (nemaStanicaK) {
  26.         b.insert(n);
  27.         krste = b.find(n);
  28.     }
  29.  
  30.     set<int>::iterator desno = next(vesna), levo = prev(vesna), desno_k = next(krste), levo_k = prev(krste);
  31.     if (desno_k == vesna && nemaStanicaV) {
  32.         desno_k = next(desno_k);
  33.     }
  34.     if (levo_k == vesna && nemaStanicaV) {
  35.         levo_k = prev(krste);
  36.         if (levo_k == krste) {
  37.             levo_k = b.end();
  38.         }
  39.     }
  40.  
  41.     int e = 0; //energija potrosena= vesna ? 1
  42.     bool vozi = !nemaStanicaV; //dali se vozi vo avtobus
  43.     int r_k = 100001;
  44.  
  45.     while (vesna != krste && r_k > 0) {
  46.         int r_l = *vesna - *levo, r_d = *desno - *vesna;
  47.         r_k = (*vesna > *krste) ? *vesna - *krste : *krste - *vesna;
  48.         r_l = r_l <= 0 ? 100001 : r_l;
  49.         r_d = r_d <= 0 ? 100001 : r_d;
  50.  
  51.         //cout << "vesna:" << *vesna << " r_k:" << r_k << " r_l:" << r_l << " r_d:" << r_d << endl;
  52.  
  53.         if (l < 2) {
  54.             e += (*vesna > *krste) ? (*vesna - *krste) * e_levo : (*krste - *vesna) * e_desno;
  55.             break;
  56.         } else if ((levo == krste || desno == krste) && (r_k <= r_l) && (r_k <= r_d)) {
  57.             if (nemaStanicaK) {
  58.                 e += (levo == krste) ? (*vesna - *krste) * e_levo : (*krste - *vesna) * e_desno;
  59.                 //cout << "\totidovme kaj krste i potrosivme energija: " << ((levo == krste) ? (*vesna - *krste) * e_levo : (*krste - *vesna) * e_desno) << endl;
  60.             }
  61.             vesna = krste;
  62.         } else {
  63.             if (!vozi) {
  64.                 int el = r_l * e_levo, ed = r_d * e_desno;
  65.                 e += el < ed ? el : ed;
  66.                 vozi = true;
  67.                 //cout << "\totidovme " << (el<ed?"levo":"desno") << " i potrosivme energija: " << (el < ed ? el : ed) << endl;
  68.             }
  69.  
  70.             if (!nemaStanicaK) {
  71.                 vesna = krste;
  72.                 //cout << "\totidovme kaj krste so avtobus";
  73.             } else {
  74.                 int k_r_l = *krste - *levo_k, k_r_d = *desno_k - *krste;
  75.                 vesna = (k_r_l < k_r_d) ? levo_k : desno_k;
  76.                 //cout << "\tk_r_l:" << k_r_l << " k_r_d:" << k_r_d << endl;
  77.             }
  78.         }
  79.         //cout << "\tvesna e sega na " << *vesna << endl;
  80.         levo = prev(vesna);
  81.         desno = next(vesna);
  82.         if (desno == b.end()) {
  83.             desno = prev(desno);
  84.         }
  85.     }
  86.  
  87.     cout << e;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment