• 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;
    }
    


  • 相关阅读:
    在source insight中阅读Python代码
    修改linux命令行提示符
    gcc链接程序时出现undefined reference to""错误
    [转]init.d解析
    [转]Linux中find常见用法示例
    Linux的网卡由eth0变成了eth1,如何修复?
    测试使用Windows Live Writer
    黑盒测试
    白盒测试技术(二)
    白盒测试技术(一)
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3312939.html
Copyright © 2020-2023  润新知