`
200830740306
  • 浏览: 109471 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

poj2299 递归与分治策略

J# 
阅读更多
package hard;

import java.io.BufferedInputStream;
import java.util.Scanner;

/**
 * poj2299
 * 利用归并排序求逆序对
 * 如果是利用冒泡的话,超时!!!
 * @author NC
 */
public class Poj2299 {

    static long num = 0;//要long才能过啊。。。。

    public static void main(String[] args) {
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        while (scan.hasNext()) {
            int n = scan.nextInt();
            if (n == 0) {
                break;
            }
            num = 0;
            int data[] = new int[n];
            for (int i = 0; i < n; i++) {
                data[i] = scan.nextInt();
            }
            mergeSort(data, 0, n - 1);
            System.out.println(num);
        }
    }

    static void mergeSort(int[] array, int left, int right) {

        if (left < right) {
            int center = (left + right) / 2;
            mergeSort(array, left, center);
            mergeSort(array, center + 1, right);
            Merge(array, left, center, right);
        }
    }

    static void Merge(int[] array, int left, int center, int right) {
        //[1,2,3,4] left=1,ceter=2,right=4
        int[] temp = new int[right - left + 1];//存放被合并后的元素
        int i = left;
        int j = center + 1;
        int k = 0;
        while (i <= center && j <= right) {
            if (array[i] > array[j]) {
                temp[k++] = array[j++];
                /* array[i]后面的数字对于array[j]都是逆序的 */
                num += center - i + 1;

            } else {
                temp[k++] = array[i++];
            }
        }
        while (i <= center) {
            temp[k++] = array[i++];
        }
        while (j <= right) {
            temp[k++] = array[j++];
        }
        //把temp[]的元素复制回array[]
        for (i = left, k = 0; i <= right; i++, k++) {
            array[i] = temp[k];
        }
    }
}


#include <stdio.h>
#include <stdlib.h>
long long num ;//一样得用long long才能过
long data[500000];
long temp[500000];
 void Merge(long array[], long left, long center, long right) {
        //[1,2,3,4] left=1,ceter=2,right=4
        int i = left;
        int j = center + 1;
        int k = 0;
       
        while (i <= center && j <= right) {
            if (array[i] > array[j]) {
                temp[k++] = array[j++];
                /* array[i]后面的数字对于array[j]都是逆序的 */
                num += center - i + 1;

            } else {
                temp[k++] = array[i++];
            }
        }
        while (i <= center) {
            temp[k++] = array[i++];
        }
        while (j <= right) {
            temp[k++] = array[j++];
        }
        //把temp[]的元素复制回array[]
        for (i = left, k = 0; i <= right; i++, k++) {
            array[i] = temp[k];
        }
    }

     void mergeSort(long array[], long left, long right) {

        if (left < right) {
            long center = (left + right) / 2;
            mergeSort(array, left, center);
            mergeSort(array, center + 1, right);
            Merge(array, left, center, right);
        }
    }

    

int main() {
    long n = 0, i;
    while (scanf("%ld", &n)) {
        if (n == 0) {
            break;
        }
        for (i = 0; i < n; i++) {
            scanf("%ld", &data[i]);
        }
        mergeSort(data,0, n-1);
        printf("%lld\n", num);
        num = 0;
    }
    return 1;
}
分享到:
评论

相关推荐

    poj2775.rar_poj_poj 27_poj27_poj2775

    描述中提到的"递归经典题目"意味着这个题目可能涉及到递归算法,递归是一种函数或过程调用自身的技术,常用于解决分治策略的问题,如树遍历、排序(如快速排序、归并排序)和求解数学问题(如斐波那契数列)等。...

    北大POJ初级-基本算法

    3. **递归与分治策略**:递归算法是解决复杂问题的有效方式,如斐波那契数列、汉诺塔问题等;分治策略常用于解决矩阵乘法、大整数乘法等问题。 4. **动态规划**:用于解决最优化问题,如背包问题、最长公共子序列、...

    poj各种分类

    这种策略在poj3295这类构造法题目中尤为适用,同时也常见于递归和动态规划中。 #### 模拟法 模拟法是对题目场景的直接模拟,适用于逻辑清晰、规则明确的问题,如poj1068和poj2632。虽然这种方法直观易懂,但在...

    poj 130题 acm pku

    - 题目2109可能是一道涉及递归或分治策略的算法题。 总的来说,这些题目涵盖了ACM竞赛中的各种核心算法和编程技巧,通过解决这些问题,参赛者可以提高自己的编程能力和算法理解,为参与ACM/ICPC比赛做好充分准备。...

    poj习题答案

    5. **递归与分治**:递归解决问题的技巧,分治策略的应用。 6. **动态规划优化**:记忆化搜索、状态压缩、滚动数组等。 7. **贪心算法**:如何在每一步选择最优解,解决背包问题、约瑟夫环等。 8. **模拟**:根据...

    本人整理的POJ解题报告大全

    10. **递归与分治**:递归是许多高级算法的基础,而分治策略如快速排序、归并排序等则可以将大问题分解为小问题进行解决。 这份解题报告不仅适合初学者逐步提升编程技能,也对有一定经验的开发者复习和巩固基础算法...

    强大的poj分类

    - POJ 2182 - Fractal(利用递归和分治思想求解) - POJ 2264 - The Die Is Cast(哈希表应用) **相关知识点**: - 不同数据结构的特点及其应用场景 - 动态数组与静态数组的区别 - 栈和队列在实际问题中的应用案例...

    很有用很有用很有用的数据结构

    可以用来实践枚举法,1456、1700和1716则适合贪心法的应用,而2299逆序数和1664递归问题可以加深对递归与分治法的理解。 总结来说,数据结构中的枚举法、贪心法和递归与分治法是解决不同种类问题的有效手段。枚举法...

    北大POJ初级-数学

    6. **递归与分治策略**:许多数学问题可以通过递归函数来解决,例如斐波那契数列、汉诺塔等。分治策略则是将大问题分解为小问题求解,如快速排序和归并排序。 7. **动态规划**:在解决一些复杂问题时,动态规划是一...

    POJ部分题解

    10. **递归与分治**:递归是解决问题的一种自然方式,而分治则是将大问题划分为小问题,逐个解决后再合并结果,如归并排序、快速排序、大整数乘法等。 总的来说,POJ题目的解题过程不仅锻炼了编程能力,更深入地...

    POJ 分类题目

    分治法则是在递归的基础上,将问题分割为两个或更多的子问题,独立解决后再合并结果。 - **示例题目**: - poj1164 - poj1941 - poj2282 - poj2299 - poj3232 - poj3233 - poj1064 - poj2255 - **应用场景**...

    poj1005.zip_北大poj1005

    8. **递归与分治**:如快速幂运算、归并排序、分治法解约瑟夫问题等。 9. **贪心算法**:适用于部分最优解的问题,如霍夫曼编码、活动安排等。 10. **回溯法与剪枝**:用于解决约束满足问题,如八皇后问题、N皇后...

    POJ 100题代码

    可以采用回溯法或深度优先搜索(DFS)策略,结合递归实现全排列的生成。 6. 题目1040《Tic Tac Toe》:此题是关于井字游戏的判断,考察博弈论和状态空间搜索。通过分析游戏状态并使用深度优先搜索或最小最大搜索...

    很快速的提高算法能力.pdf

    递归和分治法是处理复杂问题的有效工具,例如 poj2586。递推和构造法也是常用技巧,poj3295 就是一个利用构造法的实例。模拟法则用于按照问题描述进行操作,如 poj1068、poj2632 等题目。 对于图算法,熟悉深度优先...

    ACM算法总结大全——超有用!

    3. 递归与分治法:递归是函数调用自身的过程,而分治法将大问题分解为小问题求解,如poj3295中的应用。 4. 递推:通过已知的子问题状态推导出原问题的解,如斐波那契数列。 5. 构造法:直接构造问题的解决方案,如...

    POJ1000-1299中的80题AC代码

    5. **其他**:位操作、编码解码、模拟、图论问题(最短路径、最小生成树、网络流等)、递归、分治策略等。 每道题目都可能综合运用到多个知识点,而AC代码则代表了解决这些问题的有效方法。通过研究这些代码,我们...

    强大的POJ分类——各类编程简单题及其算法分类

    3. **递归和分治法**:将大问题分解为小问题,再通过递归调用来解决,如动态规划、快速排序等。 4. **递推**:通过已知的解推导出未知的解,常用于解决序列问题。 5. **构造法**:直接构造出满足条件的解,如POJ3295...

    poj 800+ 题目源代码,多年做题积累

    1557题可能涉及递归或分治策略;2488题可能需要理解并应用贪心算法;1321题可能是一道数学问题,需要良好的数学思维;2867题可能涉及到模拟或回溯法;3114题则可能需要解决复杂度较高的计算问题。 通过学习这些源...

    POJ题目分类

    - **示例题目**: poj2388, poj2299 #### 3. 字典树 - **内容**: 字典树是一种高效的数据结构,主要用于存储字符串集合。 - **示例题目**: poj2513 - **知识点**: - **字典树的特点**:节省空间;查询速度快;方便...

    北大poj AC源码1600个(C或C++)

    4. **递归与迭代**:递归和迭代是解决问题的两种常见方式,源码中会展示如何在不同问题上灵活运用这两种方法,如斐波那契数列、汉诺塔、八皇后问题等。 5. **字符串处理**:C和C++中的字符串操作也是重要的知识点,...

Global site tag (gtag.js) - Google Analytics