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

2021-10-04 04:35:02 字數 4381 閱讀 8476

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

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

請你幫幫他吧!

input

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

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

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

output

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

3

33 3 3

10 5 1

31 3 1

6 2 3

71 4 6 4 2 4 3

3 2 1 7 6 5 4

sample output

0

35

hint

上方有三組樣例。

對於第一組樣例,有三個作業它們的ddl均為第三天,zjm每天做乙個正好在ddl前全部做完,所以沒有扣分,輸出0。

對於第二組樣例,有三個作業,它們的ddl分別為第一天,第三天、第一天。zjm在第一天做了第乙個作業,第二天做了第二個作業,共扣了3分,輸出3。

題解

本題可採用貪心演算法,需要注意要將輸入按照優先分值方法排序,同時需要標記每天是否做過作業。對每個作業,找出離它最近的日期,安排完成;如果發現沒有時間完成,放棄該作業,計算扣分。

#include

#include

using

namespace std;

struct homework

}hw[

1000];

intmain()

;for

(int i =

0;i < n;i++

)for

(int i =

0;i < n;i++

)sort

(hw,hw+n)

;for

(int i =

0;i < n;i++)}

if(solved ==1)

}printf

("%d\n"

,sum);}

}/*33

3 3 3

10 5 1

31 3 1

6 2 3

71 4 6 4 2 4 3

3 2 1 7 6 5 403

5*/

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。

當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。

請你幫幫他吧!

input

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

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

output

輸出不同組合的個數。
sample input

6

-45 22 42 -16

-41 -27 56 30

-36 53 -37 77

-36 30 -75 -46

26 -38 -10 62

-32 -54 -6 45

sample output

5

樣例解釋: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).

題解

首先將輸入分配到a、b、c、d四個陣列內,注意此處使用new分配空間,由於需要求和為0,如果直接暴力,資料很大,這肯定是不行的。那就將a+b,c+d分別作為乙個新陣列。既然要找和為0,那就可以找cd陣列的相反數在ab陣列**現的次數,即為所求資料。此時為減小複雜度,先對cd排序,對每個資料採用兩次二分,分別算出這個數的相反數第一次出現的位置和最後一次出現的位置,最後一次出現的位置減去第一次出現的位置即為個數。

#include

#include

using

namespace std;

intmain()

a[j]

= x[0]

; b[j]

= x[1]

; c[j]

= x[2]

; d[j]

= x[3]

;}for(

int i =

0,k=

0;i < n; i++)}

for(

int i =

0,k =

0;i < n;i++)}

sort

(cd,cd + n * n)

;for

(int i =

0;i < n * n;i++

)else

if(ab[i]

+ cd[mid]

<0)

}for

(int j = times;j < n * n;j++)}

printf

("%d"

,sum);}

/*6-45 22 42 -16

-41 -27 56 30

-36 53 -37 77

-36 30 -75 -46

26 -38 -10 62

-32 -54 -6 45

5*/

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 的中位數
sample input

4

1 3 2 4

31 10 2

sample output

1

8

題解

本題使用暴力做法肯定是不行的,要求中位數,可想到使用二分。

首先處理絕對值,可採用先排序再相減的處理方法,這樣就可以直接得到絕對值。

中位數字置為(n * (n - 1) / 2 - 1)/2;

只需使用二分找出所在位置前數的個數,此時需再次二分;最終找出中位數字置上的數。

#include

#include

using

namespace std;

intmain()

sort

(cat,cat + n)

;int left =0;

int right = cat[n-1]

- cat[0]

;int median =

(n *

(n -1)

/2-1

)/2;

while

(left < right)

else left2 = mid2 +1;

} cnt +

= n - ans;}if

(cnt >= n *

( n -1)

/2-median )

left = mid +1;

else

right = mid;

}printf

("%d\n"

, left-1)

;}}/*

41 3 2 4

31 10 218

*/

程式設計思維與實踐 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,為測試用例的數量。每個測試用例以乙個正整...