程式設計思維week4 作業題

2021-10-04 03:51:22 字數 3916 閱讀 7790

n 個作業,每個作業都有自己的 ddl,如在ddl之前完不成作業需要扣除相應的分數。求輸入作業安排的最少減分。

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

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

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

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

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

0

35

一道練習貪心演算法的題目。貪心準則是,從最後乙個截止日期向前遍歷,優先做扣分最多的作業。在完成作業的ddl和扣分值輸入後,對作業進行排序,排序第一關鍵值是ddl日期,第二關鍵值是扣分值,排序準則均按從小到大。然後從最後乙個ddl作為當前date向前遍歷,選取目前還未過期的且扣分最多的作業在當前date完成,並在作業陣列中刪除該項。如果碰到p.back().ddl#include

#include

#include

using

namespace std;

int n;

int num;

int lostpoint;

class

hwkhwk

(int a,

int b)

public

:int ddl;

int de;

//減分};

vector p;

bool

cmp(hwk a,hwk b)

intmain()

);}//輸入作業ddl

for(

int j=

0;j)//輸入每個作業相應扣除的分數

sort

(p.begin()

,p.begin()

+num,cmp)

;//按照作業優先度排序

for(

int date=p.

back()

.ddl;date>=

1;date--

)//將這個作業做掉

p.erase

(p.begin()

+max,p.

begin()

+max+1)

;}//計算最優失分值。

while

(!p.

empty()

) cout<}return0;

}四個數列 a,b,c,d,每個數列都有 n 個數字。

若 從每個數列中各取出乙個數,求多少種方案使得 4 個數的和為 0。

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

接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字

(數字不超過 2 的 28 次方)

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
樣例解釋: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).
是一道練習二分法的題目。由於n<=4000,需要用二分法來降低複雜度。方法是先計算數列a與數列b的和儲存起來並排序。後在新數列中二分查詢數列c與數列d元素和的相反數。可以將複雜度降到o(n^2+2logn)。在這其中要注意二分查詢確定邊界時等號的使用。

**如下:

#include

#include

#include

using

namespace std;

int n;

int result=0;

int* a;

int* b;

int* c;

int* d;

vector<

int> p1;

void

count

(int a)

else}if

(p1[tar1]

!=a)

return

; st=0;

end=p1.

size()

-1;while

(st<=end)

else

} result=result+

(tar2-tar1+1)

;}intmain()

for(

int i=

0;i)sort

(p1.

begin()

,p1.

begin()

+p1.

size()

);for(

int i=

0;i) cout

}

給定乙個 n 個數的陣列 cat[i],並用這個陣列生成乙個新陣列 ans[i]。新陣列定義為對於任意的 i, j 且 i != j,均有 ans = abs(cat[i] - cat[j]),1 <= i < j <= n。試求出這個新陣列的中位數,中位數即為排序之後 (len+1)/2 位置對應的數字,』/』 為下取整。

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

4

1 3 2 4

31 10 2

輸出新陣列 ans 的中位數

1

8

用到了答案二分法求中位數,並且在搜尋新陣列newlist的時候也用到了二分法,一共用到了兩次二分。

首先對輸入數列進行排序,保證在xj-xi恒為正(j>i)以去掉絕對值。如果輸入數列大小為n,則新數列大小n=n*(n-1)/2,如果n為奇數,n++,保證n/2一定為新數列的中位數。

然後進行二分答案,左邊界為0,右邊界為原數列的最大值減最小值,設中間數p=(l+r)/2。計算滿足條件(xj-xi)<=p的二元組個數。如果小於n/2,左邊界右移至p+1,反之,有邊界左移至p。

現在只需要解決符合條件二元組的計數問題。將條件(xj-xi)<=p改寫為xi>=xj+p。在主函式中遍歷j,對於每乙個j搜尋符合條件的i。在find函式中,xj+p為固定值,在原數列中二分查詢第乙個滿足條件》=xj+p的元素下標ans,j-ans 即為數列中對乙個確定j符合條件的i的個數。對所有j進行求和,即可得到符合條件二元組個數。

**如下:

#include

#include

#include

using

namespace std;

int n,n;

int p,tmp;

int* list;

int l, r, ans,mid;

//返回newlist中滿足<=p的二元組(i,j)個數

intfind

(int p,

int j)

else

}return j-ans;

}int

main()

if(tmp < n/2)

//當計數小於n/2時。

l=p+1;

else

//當計數大於等於n/2時。

} cout<}return0;

}

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

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

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

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

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

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