继续刷水题。看到这道题目有印象,想想,貌似当初算法是想出来了。就是自己想写个链表却有 bug,结果一直拖着没有解决。好歹前几天又研究了下 STL,这下派上用场了。不过代码写的很乱,感觉不够优美,不 beautiful。最后的输入输出有些小问题,导致第一次提交是 Presentation Error。后来仔细看了看搞定。算了,先糊弄着看吧。15 道了。还有 285 道。一道一道的啃。

具体解题思路就不写了。大概如下,如果是 P ,就进行双层循环,然后搞一个数组的索引(不知道该怎么说哎……);如果是 I ,建立一个链表,从 Inversion[] 的最后一个元素开始循环,然后分别处理每个元素。根据 Inversion[i] 的数值遍历链表并插入合适的元素。最后的输入输出有问题。仔细看一下就行了。

#include <iostream>
#include <list>
using namespace std;

const int max_size = 50;

int main(int argc, char *argv[])
{
  int cases;
  char method;

  while (1) {
    cin >> cases;

    if (cases == 0) {
      break;
    }

    cin >> method;
    if (method == 'P') {
      int P[max_size], I[max_size];

      for (int i = 0; i < cases; ++i) {
        cin >> P[i];
        I[i] = 0;
      }
      for (int i = 0; i < cases; ++i) {
        for (int j = i + 1; j < cases; ++j) {
          if (P[i] > P[j]) {
            I[P[j]-1]++;
          }
        }
      }
      for (int i = 0; i < cases - 1; ++i) {
        cout << I[i] << " ";
      }
      cout << I[cases - 1] << endl;
    }
    else if (method == 'I') {
      list<int> P;
      int I[max_size];

      for (int i = 0; i < cases; ++i) {
        cin >> I[i];
      }

      P.push_back(cases);

      for (int i = cases - 2; i >= 0; --i) {
        list<int>::iterator it = P.begin();
        for (int j = 0; j < I[i]; j++) {
          it++;
        }
        P.insert(it, i+1);
      }

      list<int>::iterator it;
      int i;

      for (i = 0, it = P.begin(); i < P.size() - 1; ++it, ++i) {
        cout << *it << " ";
      }

      cout << *it << endl;
    }
    else {
      break;
    }
  }

  return 0;
}