程式設計思維與實踐 Week4作業

2021-10-04 04:05:55 字數 3531 閱讀 5469

題目:

zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。

所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。

請你幫幫他吧!

input

輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。

每個測試用例以乙個正整數n開頭(1<=n<=1000),表示作業的數量。

然後兩行。第一行包含n個整數,表示ddl,下一行包含n個整數,表示扣的分。

output

對於每個測試用例,您應該輸出最小的總降低分數,每個測試用例一行。

思路:

這題應使用貪心演算法。其貪心策略為:從最後一天開始,從所有未到ddl的作業裡選擇乙個分數最高的安排在當天,這樣一直到第一天安排完畢。針對該貪心策略有兩種複雜度不同的實現方法,這裡我採用的是o(nlogn)的方法。方法為:從最後一天開始,逐步向前一天推進。每到新的一天,就將ddl為該天的所有作業放入最大堆中(最大為分數最大),然後取出最大堆的根元素,將其安排在當天。該過程持續到第一天安排完畢後結束。之後堆中所剩作業分數之和即為最小總降低分數。

**:

#include

#include

using

namespace std;

struct ddl

;priority_queue<

int> pile;

ddl d[

1050];

int arrange[

2050];

intmain()

int maxtime=0;

for(

int j=

0;j)for

(int j=maxtime;j>=

1;j--)if

(pile.

empty()

)continue

; arrange[j]

=pile.

top();

pile.

pop();

}int scores=0;

while

(!pile.

empty()

) cout<"\n";}

}

題目:

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!

input

第一行:n(代表數列中數字的個數) (1≤n≤4000)

接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)

output

輸出不同組合的個數。

思路:

該題給人的第一印象便是暴力列舉,但是暴力列舉的複雜度高達n的4次方,顯然是無法使用的。再考慮到式子 a+b+c+d=0 可變形為 a+b=-(c+d) 的特殊性。若將兩個陣列分為一組,進行暴力列舉,再將其中乙個合併後的陣列公升序排列,根據上述式子的特殊性,可以利用二分查詢的方法來統計數目。這樣一來,複雜度為n的平方乘以logn^2。大大降低了複雜度。

**:

#include

#include

using

namespace std;

struct ddl

;priority_queue<

int> pile;

ddl d[

1050];

int arrange[

2050];

intmain()

int maxtime=0;

for(

int j=

0;j)for

(int j=maxtime;j>=

1;j--)if

(pile.

empty()

)continue

; arrange[j]

=pile.

top();

pile.

pop();

}int scores=0;

while

(!pile.

empty()

) cout<"\n";}

}

題目:

tt 是一位重度愛貓人士,每日沉溺於 b 站上的貓咪頻道。有一天,tt 的好友 zjm 決定交給 tt 乙個難題,如果 tt 能夠解決這個難題,zjm 就會買乙隻可愛貓咪送給 tt。任務內容是,給定乙個 n 個數的陣列 cat[i],並用這個陣列生成乙個新陣列 ans[i]。新陣列定義為對於任意的 i, j 且 i != j,均有 ans = abs(cat[i] -cat[j]),1 <= i < j <= n。試求出這個新陣列的中位數,中位數即為排序之後 (len+1)/2 位置對應的數字,』/』 為下取整。tt 非常想得到那只可愛的貓咪,你能幫幫他嗎?

input

多組輸入,每次輸入乙個 n,表示有 n 個數,之後輸入乙個長度為 n 的序列 cat, cat[i] <= 1e9 , 3 <= n <= 1e5

output

輸出新陣列 ans 的中位數

思路:

該題給人的第一感覺也是列舉,但在這樣龐大的資料量下列舉的n的2次方複雜度顯然不行。因此, 這裡就另闢蹊徑 ,用一種驗證中位數的方法來求中位數。一般來說 ,中位數不會大於一組數中的(max-min) ,因此,我們就使用二分法對一組0 - (max - min)的數中尋找名次為 (len + 1) / 2 且存在於新陣列中的數。於是,新的問題出現了,如何判斷乙個數p在新陣列中的名次?這裡我們可以通過統計 ans[ j ]-ans[ i ] <= p 這一式子中滿足 條件的i,j個數,即在 ans[i]+p>=ans[j] 這一式子中滿足條件的i的個數,但在作此轉化前需要將cat陣列公升序排列以達到去掉絕對值的效果。而對i的個數的統計,同樣可以使用二分查詢。但是要注意這兩個二分查詢的一些細節,因為根據你二分查詢的寫法不一樣,結果可能差異很大,需要不斷除錯。

**:

#include

#include

using

namespace std;

int flag=0;

int a[

100050];

intrank

(int p,

int size)

else}if

(ans==-1

)continue

; rank=rank+ans-i;

}return rank;

}int

main()

else

}printf

("%d\n"

,ans);}

}

程式設計思維與實踐 Week4 作業

a ddl 的恐懼 zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!input 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用...

程式設計思維與實踐 Week4 作業

zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!input 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用...

《程式設計思維與實踐》week4 作業題

zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用例以乙個正整...