hdu 1394 Minimum Inversion Number(逆序数对) f…
2018-06-17 20:27:53来源:未知 阅读 ()
http://acm.hdu.edu.cn/showproblem.php?pid=1394 //hdu 题目
http://www.fjutacm.com/Problem.jsp?pid=1268 //fjut 题目 转自hdu
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.
给定一个数组 a1,a2....an,定义逆序数对(i,j)满足条件 i< j 且 ai > aj。
现在题目给你数组,求他的所有循环数组的逆序数对中最少的是多少。
所谓循环数组即为:
a1, a2, ..., an-1, an (从1开始的初始数组)
a2, a3, ..., an, a1 (从a2开始到an,再加上a1)
a3, a4, ..., an, a1, a2 (a3开始到an,再连上a1和a2)
...
an, a1, a2, ..., an-1 (an,然后从a1到a(n-1))
输入有多组数据. 每个测试案例的第一行是一个数n(n <= 5000)表示数组长度: 接下来一行是n个数表示数组内容,数组内的数字是0~n-1以内的数,且没有重复
思路:
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 5005; int c[maxn], a[maxn], n; inline int lowbit(int x){ return x&(-x); } void update(int i, int value){ while(i <= n){ c[i] += value; i += lowbit(i); } } int sum(int i){ int s = 0; while(i > 0){ s += c[i]; i -= lowbit(i); } return s; } int main(){ while(~scanf("%d", &n)){ for (int i = 1; i <= n; ++i){ c[i] = 0; } int s = 0; //最开始逆序数对数为0 for(int i = 1; i <= n; i ++){ scanf("%d", &a[i]); a[i] ++; //树状数组从1开始 数据范围(0~n-1) s += (sum(n) - sum(a[i])); //找出所有比a[i]大的数的逆序数对数 update(a[i], 1); //记录这个数 } int ans = s; for(int i = 1; i < n; i ++){ s += (n - a[i]*2 + 1); //比较完后因为 n 个数范围(0~n-1)且不重复, 所以比a[i] 小的数为a[i] - 1; // 每次将头元素移至末尾都会减少比头小的数(a[i] - 1)个逆序数,增加比头大的数(n - a[i])个逆序数 // 所以增加的逆序数为 n - a[i] * 2 + 1 [+(n - a[i]) -(a[i] - 1)] if(ans > s) //记录更少的逆序数对数 ans = s; } printf("%d\n", ans); } return 0; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- HDU-2955-Robberies(0-1背包) 2020-03-30
- hdu1455 拼木棍(经典dfs) 2020-02-29
- anniversary party_hdu1520 2020-02-16
- hdu1062 text reverse 2020-01-27
- hdu4841 2020-01-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash