zoukankan      html  css  js  c++  java
  • UVa 11495

      题目大意:给一个有n个数的序列,通过交换相邻的逆序数使这个序列最终有序,求需要交换的次数。

      本来可以用冒泡排序解决,但是n达到105,用冒泡排序会超时,用O(nlogn)的归并排序可以达到要求。《算法竞赛入门经典》第八章的“逆序对数”有详细介绍。

     1 #include <cstdio>
     2 #define MAXN 100000+10
     3 
     4 int a[MAXN], tmp[MAXN];
     5 int cnt;
     6 
     7 void merge_sort(int l, int r)
     8 {
     9     if (r-l == 1)  return;
    10     int mid = l + (r-l)/2;
    11     merge_sort(l, mid);
    12     merge_sort(mid, r);
    13     int p = l, q = mid, k = l;
    14     while (p < mid || q < r)
    15     {
    16         if (q >= r || (p < mid && a[p] < a[q]))
    17             tmp[k++] = a[p++];
    18         else
    19         {
    20             tmp[k++] = a[q++];
    21             cnt += mid - p;
    22         }
    23     }
    24     for (int i = l; i < r; i++)
    25         a[i] = tmp[i];
    26 }
    27 
    28 int main()
    29 {
    30 #ifdef LOCAL
    31     freopen("in", "r", stdin);
    32 #endif
    33     int n;
    34     while (scanf("%d", &n) && n)
    35     {
    36         for (int i = 0; i < n; i++)
    37             scanf("%d", &a[i]);
    38         cnt = 0;
    39         merge_sort(0, n);
    40         if (cnt % 2)  printf("Marcelo
    ");
    41         else  printf("Carlos
    ");
    42     }
    43     return 0;
    44 }
    View Code
  • 相关阅读:
    203. Remove Linked List Elements
    86. Partition List
    143. Reorder List
    876. Middle of the Linked List
    246. Strobogrammatic Number
    202. Happy Number
    数据类型转换
    表达式
    面向对象
    对齐
  • 原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3293141.html
Copyright © 2011-2022 走看看