zoukankan      html  css  js  c++  java
  • HDOJ 2689

    Sort it

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1940    Accepted Submission(s): 1390

    Problem Description
    You want to processe a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. Then how many times it need.
    For example, 1 2 3 5 4, we only need one operation : swap 5 and 4.
     
    Input
    The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 1000); the next line contains a permutation of the n integers from 1 to n.
     
    Output
    For each case, output the minimum times need to sort it in ascending order on a single line.
     
    Sample Input
    3 1 2 3 4 4 3 2 1
     
    Sample Output
    0 6
     
    Author
    WhereIsHeroFrom
     
    Source
     
    Recommend
    yifenfei
     
    题意是给你一个序列,问你最少交换多少次可以使整个序列单调上升。
    数据只有1000,直接n^2可做,但是有一种更为精妙的方法——树状数组 0Ms
    我们先初始化整个序列为0,然后每输入一个数x,就在x位置将0换成1,此时求该位置的sum,就是比x小的数字数目,显然i - sum就是是这个数字要交换的次数。
    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[1010], c[1010] , n;
    int lowbit(int x)
    {
        return x & (-x);
    }
    int sum(int x)
    {
        int sum = 0;
        while(x > 0)
        {
            sum += c[x];
            x -= lowbit(x);
        }
        return sum;
    }
    void update(int x , int num)
    {
        while(x <= n)
        {
            c[x] += num;
            x += lowbit(x);
        }
    }
    int main()
    {
        while(~scanf("%d" , &n))
        {
            memset(a , 0 , sizeof(a));
            memset(c , 0 , sizeof(c));
            int ans = 0;
            int x;
            for(int i = 1 ; i <= n ; i++)
            {
                scanf("%d" , &x);
                update(x , 1);
                ans += i - sum(x);
            }
            printf("%d
    " , ans);
        }
        return 0;
    }
    


  • 相关阅读:
    Codeforces Round #604(Div. 2,
    简单的三层框架以及使用dbutils进行数据库操作(入门)
    DBUtil数据库工具封装
    GUI 中监听 文本框实时改变的实例
    java基础教程GUI
    Dao层通用化,Spring3.0+Hibernate3.3.2通用Dao层整合
    计算器代码
    记事本应用程序java源代码
    GUI
    dbutils开源项目用法
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3312939.html
Copyright © 2011-2022 走看看