hdu1394 求最小逆序数
2017-04-03 16:20
295 查看
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj.
For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:
a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)
You are asked to write a program to find the minimum inversion number out of the above sequences.
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000);
the next line contains a permutation of the n integers from 0 to n-1.
没有看懂为什么要用线段树做tvt
因为数据给得很凑巧(0..n-1),数据也小,就暴力了。
#include <iostream>
using namespace
std;
int num[5050];
int main()
{
int n;
while (cin >> n) {
for (int i =
0; i < n; i ++) {
cin >>
num[i];
}
int sum =
0;
for (int i =
0; i < n; i ++) {
for (int j = i +
1; j < n; j ++) {
if (num[j] <
num[i]) {
sum ++;
}
}
}
int mini = sum;
for (int i =
0; i < n; i ++) {
sum = sum - num[i] + n -
1 -
num[i];//当把i从第一个放到最后一个时,逆序数增加(在num[1..n
- 1]中)比i大的数的个数,减少比i小的数的个数
mini = min(sum,mini);//因为数从0..n - 1,所以比i大的数有n
- 1 - i,比i小的数有i个(0..i
- 1),
}
cout << mini <<
endl;
}
return
0;
}
For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:
a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)
You are asked to write a program to find the minimum inversion number out of the above sequences.
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000);
the next line contains a permutation of the n integers from 0 to n-1.
没有看懂为什么要用线段树做tvt
因为数据给得很凑巧(0..n-1),数据也小,就暴力了。
#include <iostream>
using namespace
std;
int num[5050];
int main()
{
int n;
while (cin >> n) {
for (int i =
0; i < n; i ++) {
cin >>
num[i];
}
int sum =
0;
for (int i =
0; i < n; i ++) {
for (int j = i +
1; j < n; j ++) {
if (num[j] <
num[i]) {
sum ++;
}
}
}
int mini = sum;
for (int i =
0; i < n; i ++) {
sum = sum - num[i] + n -
1 -
num[i];//当把i从第一个放到最后一个时,逆序数增加(在num[1..n
- 1]中)比i大的数的个数,减少比i小的数的个数
mini = min(sum,mini);//因为数从0..n - 1,所以比i大的数有n
- 1 - i,比i小的数有i个(0..i
- 1),
}
cout << mini <<
endl;
}
return
0;
}
相关文章推荐
- hdu 1394 Minimum Inversion Number 最小逆序数
- 线段树习题(2)hdu 1394 求最小逆序数
- HDU 1394 Minimum Inversion Number 线段树求最小逆序数
- HDU 1394 Minimum Inversion Number (最小逆序对数&线段树)
- hdu1394 Minimum Inversion Number 最小逆序数 线段树单点更新区间查询
- hdu1394求最小逆序----树状数组解决
- hdu 1394 最小逆序数
- hdu 1394 求循环串的最小逆序数 暴力法 线段树 归并排序3种方法
- HDU-1394-Minimum Inversion Number(最小逆序数-模拟)
- 循环串的最小逆序(hdu 1394)
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
- hdu 1394 求一个序列的最小逆序数 单点增 区间求和
- hdu1394 线段树求最小逆序数
- HDU1394-Minimum Inversion Number-归并排序求最小逆序数
- hdu 1394 Minimum Inversion Number 归并排序求逆序数 求一串数的最小逆序数
- HDU 1394 Minimum Inversion Number 最小逆序数 线段树
- hdu1394 Minimum Inversion Number 逆序数、最小逆序数
- HDU 1394(最小逆序数)【也可用线段树求解】
- hdu 1394 线段树求逆序数
- [HDU 1394]求全排列逆序数最大值[线段树]