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

2021-10-04 01:10:34 字數 4580 閱讀 1030

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

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

請你幫幫他吧!

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

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

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

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

333

33105

1313

1623

7146

4243

3217

654

0

35

首先,將所有的作業按照所扣分數從大到小的順序進行排列,分數相同的將ddl在前的放在前面;

申請乙個大小為1002,所有元素值都為0的乙個陣列yns[ ]用來代表第n天沒有被安排作業;

從第乙個作業開始,一直往後遍歷,對於第i個作業,從陣列yns[deadline_i]開始往前,如果有為0的地方,那麼這個作業就能按時完成,不會被扣分,同時將陣列中這個位置的元素值置為1;

#include

#include

#include

#include

#include

#include

using

namespace std;

int t;

int n;

int s;

int d;

struct zuoye };

bool

px(zuoye x, zuoye y)

vector all;

intpanduan

(vector a,

int*yns,

int sum)

else

symbol--;}

sum = sum + i-

>score;

}return sum;

}int

main()

for(

int b =

0; b < n; b++

)sort

(all.

begin()

, all.

end(

), px)

; cout<<

panduan

(all, yns, sum)

clear()

;}}

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

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

請你幫幫他吧!

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

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

輸出不同組合的個數。

6-45

2242-16

-41-27

5630-36

53-3777-36

30-75-

4626-38

-1062-

32-54-

645

5
由於 n <= 4000 ,所以採用列舉出所有的和的情況,必然超時;

整體代換思路:a + b + c + d = 0 => a + b = - (c + d)

將a + b的所有情況進行列舉,儲存在乙個vector< int > sab陣列裡面;

對於c + d,則是每計算出一種情況,就將這個值的相反數去 sab 中尋找;

尋找的方法: 利用二分的搜尋方法,在 sab 中查詢到等於- (c + d)的第一次出現位置和最後一次出現的位置,那麼總共的種類數就是最後一次出現的位置數 – 第一次出現的位置數 + 1;如果沒有查詢到則是會返回-1;

#include

#include

#include

#include

#include

#include

using

namespace std;

int n;

int kinds =0;

vector<

int> a;

vector<

int> b;

vector<

int> c;

vector<

int> d;

vector<

int>sab;

intfindf

(int sum)

else left = mid +1;

}return ans;

}int

findl

(int sum)

else left = mid +1;

}return ans;

}int

main()

for(

int l =

0; l < n; l++)}

sort

(sab.

begin()

, sab.

end())

;for

(int l =

0; l < n; l++)}

cout<}

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 非常想得到那只可愛的貓咪,你能幫幫他嗎?

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

輸出新陣列 ans 的中位數

413

2431

102

1

8

利用sort函式將cat的元素從小到大進行排序,這樣就避免考慮差值為負的情況下還要求其絕對值;

若已知了陣列cat的數量,那麼根據排列組合規則,可以得到差值的個數為 ,也就可以得到中位數的名次應該為<(n * (n - 1) + 2) / 4>;

求目標中位數p:

由題意可得,pmin = 0; pmax = cat[n - 1] - cat[0];即相當於二分的左端點是pmin,右端點是pmax;

p的名次相當與是cat[ ]中,x_i - x_j <= p的數對的數量,轉換一下也就是x_i <= x_j + p,通過列舉下標 i 的值,然後計算滿足條件的下標 j 的數量,即為p對應的名次;

求中位數的過程即是對於p的名次進行二分查詢的過程,求pmid的值之後求其名次,直到名次等於<(n * (n - 1) + 2) / 4>;

特別地結束迴圈的條件應該是(rank >= mid_location)而不是(rank == mid_location),因為可能會出現乙個數它滿足名次的條件,但是它並不存在與目標陣列中;

例如:差值陣列為1 1 1 3 3 3,依題意其中位數應該是1,但是可以發現2其實是滿足條件的,假如判斷條件是(rank == mid_location)輸出的結果是2,與題意不符;

#include

#include

#include

#include

#include

#include

using

namespace std;

int n;

vector<

int> cat;

intfindl

(int sum)

}return ans;

}int

rankp

(int mid_location)

if(rank >= mid_location)

else pleft = pmid +1;

}return ans;

}int

main()

sort

(cat.

begin()

, cat.

end())

;int mid_location =

(n *

(n -1)

+2)/

4;cout<<

rankp

(mid_location)

<}}

程式設計思維week4 作業題

n 個作業,每個作業都有自己的 ddl,如在ddl之前完不成作業需要扣除相應的分數。求輸入作業安排的最少減分。輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用例以乙個正整數n開頭 1 n 1000 表示作業的數量。然後兩行。第一行包含n個整數,表示ddl,下一行包含n個整...

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

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

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

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