E. Jeff and Permutation----思维题

来源:互联网 发布:mac修容 编辑:程序博客网 时间:2024/05/18 13:25

E. Jeff and Permutation
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Jeff's friends know full well that the boy likes to get sequences and arrays for his birthday. Thus, Jeff got sequence p1, p2, ..., pn for his birthday.

Jeff hates inversions in sequences. An inversion in sequence a1, a2, ..., an is a pair of indexes i, j (1 ≤ i < j ≤ n), such that an inequality ai > aj holds.

Jeff can multiply some numbers of the sequence p by -1. At that, he wants the number of inversions in the sequence to be minimum. Help Jeff and find the minimum number of inversions he manages to get.

Input

The first line contains integer n (1 ≤ n ≤ 2000). The next line contains n integers — sequence p1p2...pn (|pi| ≤ 105). The numbers are separated by spaces.

Output

In a single line print the answer to the problem — the minimum number of inversions Jeff can get.

Examples
input
22 1
output
0
input
9-2 0 -1 0 -1 2 1 0 -1
output
6

题目链接:http://codeforces.com/contest/351/problem/E


题目的意思是说给你一串序列,里面的每一个数都可以任意变换正负号,求最小逆序对的个数。

思路挺简单,为什么我没有想到。。

既然正负号可以任意变换,我们在存的时候可以存绝对值,对于每一个数来说,小于它的数,不管在左边还是右边,符号变换对它没有影响,所以我们直接加上数目较少的一边就可以。

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;int a[20000];int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d",&a[i]);        a[i]=abs(a[i]);    }    int ans=0;    for(int i=0;i<n;i++){        int l=0,r=0;        for(int j=0;j<i;j++){            if(a[j]<a[i])                l++;        }        for(int j=i+1;j<n;j++){            if(a[i]>a[j]){                r++;            }        }        ans+=min(l,r);    }    printf("%d\n",ans);    return 0;}

大牛链接:http://www.lai18.com/content/913044.html