1481 偷懶的西西

2021-08-09 01:49:31 字數 1178 閱讀 6585

高三數學作業總共有n道題目要寫(其實是抄),編號1..n,抄每道題所花時間不一樣,抄第i題要花a[i]分鐘。由於西西還要準備noip,顯然不能成天做數學作業。所以西西決定只用不超過t分鐘時間抄這個,因此必然有空著的題。每道題要麼不寫,要麼抄完,不能寫一半。一段連續的空題稱為乙個空題段,它的長度就是所包含的題目數。這樣應付自然會引起數學老師的憤怒。數學老師發怒的程度(簡稱發怒度)等於最長的空題段長度。

現在,西西想知道他在這t分鐘內寫哪些題,才能夠盡量降低數學老師的發怒度。由於西西很聰明,你只要告訴他發怒度的數值就可以了,不需輸出方案。(someone:那麼西西怎麼不自己寫程式?西西:我還在抄別的科目的作業……)

60分方法:

這道題60分的資料很簡單,就是先用二分最小的發怒值,然後用乙個dp,f[

i]表示到第i個作業所需要的最少時間,然後狀態轉移方程便呼之欲出了: f[

i]=m

in(f

[j])

+a[i

](i−

mid−

1<=

j<=i−

1)最後的答案為mi

n(f[

i])(

n−mi

d<=

j<=n)

時間複雜度為o(

log2

n∗n2

) 100分方法:

其實,只要仔細思考,我們便發現這是可以用單調佇列來維護的。如果你的作業編號較小,你的答案就一定要小,不然是沒有意義的。所以我們就可以用單調佇列來維護f陣列。

時間複雜度為o(

log2

n∗n)

#include

#include

using namespace std;

int a[51000],f[51000];

int mymin(int

x,int

y) struct node

tr[51000];

int main()

int l=0,r=n,ans;

while(l<=r)

int min=999999999;

for(int i=n-mid;i<=n;i++)

}if(min>t)

else

}printf("%d\n",ans);

return

0;}

jzoj1481 偷懶的西西

高三數學作業總共有n道題目要寫 其實是抄 編號1.n,抄每道題所花時間不一樣,抄第i題要花a i 分鐘。由於西西還要準備noip,顯然不能成天做數學作業。所以西西決定只用不超過t分鐘時間抄這個,因此必然有空著的題。每道題要麼不寫,要麼抄完,不能寫一半。一段連續的空題稱為乙個空題段,它的長度就是所包含...

《單調佇列》《二分》4 偷懶的西西

高三數學作業總共有n道題目要寫 其實是抄 編號1.n,抄每道題所花時間不一樣,抄第i題要花a i 分鐘。由於西西還要準備noip,顯然不能成天做數學作業。所以西西決定只用不超過t分鐘時間抄這個,因此必然有空著的題。每道題要麼不寫,要麼抄完,不能寫一半。一段連續的空題稱為乙個空題段,它的長度就是所包含...

偷懶的代價

在正式測試之前,給開發制定各種模板和規範的時候,曾經想過給開發制定乙份統計規範,但最終因為那段時間事情太多,偷懶少寫了乙份統計規範文件,抱著僥倖的心理以為這本身應該是開發的設計工作,他們在實現功能之前應該會自己先編寫乙份規範或在頭腦裡形成乙個清晰的思路。可是,在iagw m部分的 提交統計部分的測試...