zoukankan      html  css  js  c++  java
  • D

    - 题目大意

         给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列。

    - 解题思路

        利用归并排序来求逆序数(特别注意数组的大小,太大的话再开个数组分开装)。

    - 代码

    #include<iostream>
    #include<cstring>
    using namespace std;
    const long long MAX = 500001;
    long long num[MAX];
    long long num1[MAX];
    long long sum;
    void find(int l, int r)
    {
    	if (l + 1 < r)
    	{
    		int m = l + (r - l) / 2;
    		int p = l, q = m, i = l;
    		find(l, m);
    		find(q, r);
    
    		while (p < m || q < r)
    		{
    			if (q >= r || (p < m&&num[p] <= num[q]))
    				num1[i++] = num[p++];
    			else
    			{
    				num1[i++] = num[q++];
    				sum += m - p;
    			}
    		}
    		for (int i =l; i < r; i++)
    			num[i] = num1[i];
    	}
    }
    int main()
    {
    	int m;
    	while (cin >> m)
    	{
    		if (m == 0)
    			break;
    		sum = 0;
    		memset(num, 0, sizeof(num));
    		memset(num1, 0, sizeof(num1));
    		for (int j = 0; j <m; j++)
    			cin >> num[j];
    		find(0, m);
    		cout << sum << endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    第二章 课后习题 6
    第二章 课后习题 5
    第一章 课后习题 10
    第一章 课后习题 7
    JAVA练习1
    作业2
    作业
    c++作业10月13日作业
    c++作业50页例题3.1
    for循环作业4和5
  • 原文地址:https://www.cnblogs.com/alpacadh/p/8448900.html
Copyright © 2011-2022 走看看