題目:
排列(sum.cpp/c/pas)
時間限制:1s
記憶體限制:256mb
【問題描述】給出乙個隨機的排列,請你計算最大值減最小值的差小於等於 0~n-1 的區間分別有多少個。
【輸入】 tyvj.cn輸入檔名為 sum.in。第一行乙個數 t(<=10),表示資料組數對於每一組資料:第一行乙個數 n(1<=n<=100,000)第二行 n 個數 a1...an,表示乙個隨機的排列。
【輸出】輸出檔名為 sum.out。對於每組資料輸出 n 行,分別表示差值小於等於 0~n-1 的區間個數
【輸入樣例】sum.in sum.out
3 2 4 1
【輸出樣例】
4 【資料說明】對於 30%的資料,1<=n<=300;對於 60%的資料,1<=n<=5000對於 100%的資料,1<=n<=100000
個人題解:(注:開啟關閉檔案已隱藏,而且這只是個人題解,可能過不了所有點,不過樣例是過了的。)
var
t,n,i:longint;
a:array[1..100000]of longint;
function maxmin(i,j:longint):longint;
//此函式的目的為找到子區間中最大值和最小值,並把差值賦值給函式maxmin;
var k,max,min:longint;
begin
max:=a[i]; min:=a[i];
for k:=i to j do
begin
if a[k]>max then max:=a[k];
if a[k]end;
maxmin:=max-min;
end;
procedure pai;
varb:array[0..100000]of longint;//記錄每乙個小於等於0~n-1的差值的數目。
i,j,k:longint;
begin
readln(n);
for i:=1 to n do
read(a[i]);
readln;
i:=1; j:=1;
repeat
for k:=maxmin(i,j) to n-1 do
//把從子區間中最大值和最小值的差,到n-1的所有個數都加一。
inc(b[k]);
inc(j);
if j>n then begin inc(i); j:=i; end;//這兩步是在列舉每乙個子區間。i,j相當於兩個指標。
until (i>n)and(j>n);//直到區間列舉完畢。
for i:=0 to n-1 do
writeln(b[i]);
end;
begin//(以下不解釋)
//openn;
readln(t);
for i:=1 to t do pai;
//closee;
end.
考試題 排列 分治 樹形DP
題意 求有多少種排列滿足 i 之前第乙個小於 i 的位置是 q i 如果沒有 q i 的限制,答案就是全排列,然後 q i 會限制一些元素之間的大小關係.直接做的話沒辦法方便地求出元素之間的大小關係.不妨思考單調棧的過程 如果遇到字首最小值的話肯定會將棧清空.那麼也就是說如果最小值 i 將序列分為 ...
考試題 排列 分治 樹形DP
題意 求有多少種排列滿足 i 之前第乙個小於 i 的位置是 q i 如果沒有 q i 的限制,答案就是全排列,然後 q i 會限制一些元素之間的大小關係.直接做的話沒辦法方便地求出元素之間的大小關係.不妨思考單調棧的過程 如果遇到字首最小值的話肯定會將棧清空.那麼也就是說如果最小值 i 將序列分為 ...
軟體工程考試題二
一 選擇題 1 軟體危機出現於 為了解決軟體危機,人們提出了用 的原理來設計軟體,這是軟體工程誕生的基礎。a 50年代末 b 60年代初 c 60年代末 d 70年代初 a 運籌學 b 工程學 c 軟體學 d 軟體學 e 數字 2 開發軟體需高成本和產品的低質量之間有著尖銳的矛盾,這種現象稱作 a....