vlatkovski

Patiki (NEDOVERSENO, TREBA DA SE OPTIMIZIRA)

Jun 15th, 2017
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3.  
  4. using namespace std;
  5.  
  6. int main() {
  7.     int n, potezi = 0;
  8.     cin >> n;
  9.  
  10.     map<int, bool> poz; //pozicii na parovi patiki so isti strani (LL ili DD)
  11.  
  12.     for (int i = 0; i < n; ++i) {
  13.         char p1, p2;
  14.         cin >> p1 >> p2;
  15.  
  16.         bool a1 = p1 != 'L', a2 = p2 == 'D';
  17.  
  18.         if (a1 == a2) {
  19.             poz[i] = a1;
  20.             //cout << "poz[" << i << "] = " << a1 << endl;
  21.         }
  22.     }
  23.  
  24.     while (!poz.empty()) {
  25.         map<int, bool>::iterator it = poz.begin();
  26.         int i = (*it).first;
  27.         bool a = (*it).second;
  28.         //cout << "i=" << i << " a=poz[" << i << "].second=" << a << endl;
  29.         map<int, bool>::iterator jt = it;
  30.         bool reachedEnd = next(jt) == poz.end();
  31.  
  32.         while (1) {
  33.             if (reachedEnd) {
  34.                 if (prev(jt) == jt) { //jt e na pocetokot, ova e 'failsafe' :^)
  35.                     break;
  36.                 } else if ((*jt).first >= i) { //j >= i
  37.                     jt = prev(it); //j = i - 1
  38.                 } else { //j < i
  39.                     --jt;
  40.                 }
  41.             } else {
  42.                 ++jt;
  43.                 reachedEnd = next(jt) == poz.end();
  44.             }
  45.  
  46.             int j = (*jt).first;
  47.             bool b = (*jt).second;
  48.             //cout << "\tj=" << j << " b=" << b << endl;
  49.             if (b == !a) {
  50.                 potezi += (j - i > 0) ? j - i : i - j; //zemi aboslutna vrednost
  51.                 //cout << "\t\tbrisam kutii so i=" << i << ", a=" << a << ", j=" << j << ", b=" << b << endl;
  52.                 poz.erase(it);
  53.                 poz.erase(jt);
  54.                 break;
  55.             }
  56.         }
  57.     }
  58.  
  59.     cout << potezi;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment