最接近神的人(sophist/pas/c/cpp)
2011-09-25 20:18
155 查看
最接近神的人(sophist/pas/c/cpp)
【题目描述】
破解了符文之语,小FF开启了通往地下的道路。当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案。而石门上方用古代文写着“神的殿堂”。小FF猜想里面应该就有王室的遗产了。但现在的问题是如何打开这扇门……
仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的。而最聪明的人往往通过一种仪式选拔出来。仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即交换序列中相邻的两个元素。而用最少的交换次数使原序列变成不下降序列的人即是下一任智者。
小FF发现门上同样有着n个数字。于是他认为打开这扇门的秘诀就是找到让这个序列变成不下降序列所需要的最小次数。但小FF不会……只好又找到了你,并答应事成之后与你三七分……
【输入格式】
第一行为一个整数n,表示序列长度
第二行为n个整数,表示序列中每个元素。
【输出格式】
一个整数ans,即最少操作次数。
【输入样例】
4
2 8 0 3
【输出样例】
3
样例说明:开始序列为2 8 0 3,目标序列为0 2 3 8,可进行三次操作的目标序列:
1.Swap (8,0):2 0 8 3
2.Swap (2,0):0 2 8 3
3.Swap (8,3):0 2 3 8
【数据范围】
对于30%的数据1≤n≤104。
对于100%的数据1≤n≤5*105;
-maxlongint≤A[i]≤maxlongint。
===============================
归并排序,求逆序对
========================
【题目描述】
破解了符文之语,小FF开启了通往地下的道路。当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案。而石门上方用古代文写着“神的殿堂”。小FF猜想里面应该就有王室的遗产了。但现在的问题是如何打开这扇门……
仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的。而最聪明的人往往通过一种仪式选拔出来。仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即交换序列中相邻的两个元素。而用最少的交换次数使原序列变成不下降序列的人即是下一任智者。
小FF发现门上同样有着n个数字。于是他认为打开这扇门的秘诀就是找到让这个序列变成不下降序列所需要的最小次数。但小FF不会……只好又找到了你,并答应事成之后与你三七分……
【输入格式】
第一行为一个整数n,表示序列长度
第二行为n个整数,表示序列中每个元素。
【输出格式】
一个整数ans,即最少操作次数。
【输入样例】
4
2 8 0 3
【输出样例】
3
样例说明:开始序列为2 8 0 3,目标序列为0 2 3 8,可进行三次操作的目标序列:
1.Swap (8,0):2 0 8 3
2.Swap (2,0):0 2 8 3
3.Swap (8,3):0 2 3 8
【数据范围】
对于30%的数据1≤n≤104。
对于100%的数据1≤n≤5*105;
-maxlongint≤A[i]≤maxlongint。
===============================
归并排序,求逆序对
========================
var n:longint; ans:int64; a,g:array[0..500001]of longint; procedure init; begin assign(input,'sophist.in'); assign(output,'sophist.out'); reset(input); rewrite(output); end; procedure terminate; begin close(input);close(output); halt; end; procedure guibing(s,t:longint); var mid:longint; i,j,k:longint; begin if s=t then exit; mid:=(s+t) shr 1; guibing(s,mid); guibing(mid+1,t); i:=s; j:=mid+1; k:=s; while (i<=mid) and (j<=t) do begin if a[i]<=a[j] then begin g[k]:=a[i]; inc(i); inc(k); end else begin g[k]:=a[j]; inc(j); inc(k); ans:=ans+mid-i+1; end; end; while i<=mid do begin g[k]:=a[i]; inc(i); inc(k); end; while j<=t do begin g[k]:=a[j]; inc(j); inc(k); end; for i:=s to t do a[i]:=g[i]; end; procedure main; var i:longint; begin readln(n); for i:=1 to n do begin read(a[i]); end; ans:=0; guibing(1,n); writeln(ans); end; begin init; main; terminate; end.
相关文章推荐
- 试题二:最接近神的人(sophist/pas/c/cpp) (逆序对)
- 津津的储蓄计划(save.pas/c/cpp)
- Problem 1 东风谷早苗(robot.cpp/c/pas)
- 2、种树(trees.pas/c/cpp)贪心
- 【动规递推】旅行(travel.pas/c/cpp)
- 【最长上升子序列+二分优化】麻烦的聚餐 egroup.pas/c/cpp
- T4870 水灾(sliker.cpp/c/pas) 1000MS 64MB
- jzoj 1730. 【10.5NOIP普及模拟】sort(sort.pas/cpp)
- 越越的交通指挥系统 (traffic.pas/c/cpp)
- 2018.01.26【NOIP普及组】模拟赛D组——游戏(atlantis.pas/cpp)
- JZOJ(中山纪中) 1983. 【普及组模拟赛】手机(mobile.pas/cpp)
- YZOI Easy Round 2_化简(simplify.c/cpp/pas)
- 魔法物品(magic.pas/c/cpp)
- T1: 城墙(sandcas.pas/cpp)
- 传球游戏(ball.pas/c/cpp)
- 找啊找啊找GF(gf.pas/c/cpp)
- 试题三:古代人的难题( puzzle.pas/c/cpp) 斐波那契数列
- 【动态规划】【单调队列】最大子序列的和 (max.c/cpp/pas)
- 【模拟】贾老二的工件 jia.pas/c/cpp
- 【最大子区间和】旅游路线(travel.pas/c/cpp)