2017 9 23 考試題二 排列

2021-08-08 16:13:29 字數 1899 閱讀 5408

題目:

排列(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....