高三數學作業總共有n道題目要寫(其實是抄),編號1..n,抄每道題所花時間不一樣,抄第i題要花a[i]分鐘。由於西西還要準備noip,顯然不能成天做數學作業。所以西西決定只用不超過t分鐘時間抄這個,因此必然有空著的題。每道題要麼不寫,要麼抄完,不能寫一半。一段連續的空題稱為乙個空題段,它的長度就是所包含的題目數。這樣應付自然會引起數學老師的憤怒。數學老師發怒的程度(簡稱發怒度)等於最長的空題段長度。
現在,西西想知道他在這t分鐘內寫哪些題,才能夠盡量降低數學老師的發怒度。由於西西很聰明,你只要告訴他發怒度的數值就可以了,不需輸出方案。(someone:那麼西西怎麼不自己寫程式?西西:我還在抄別的科目的作業……)
60%資料 n<=2000其實和前面的一題烽火傳遞很像,都是有乙個區間範圍去取最大值(或最小值),只不過是加上a[100%資料 0
i],即f[
i]=m
in(f
[j]+
a[i]
)(jm−1)
並且最小值,那麼明顯的二分+判定。
#include
#include
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using
namespace
std;
const
int n=50005;
int n,m,i,l,r,mid,a[n],g[n],f[n];
bool check(int x)
return f[n+1]<=m;
}int main ()
if (check(l-1)) l--;
printf("%d",l);
}
尋找段落(二分 單調佇列)
題目描述 給定乙個長度為n的序列a i,定義a i 為第i個元素的價值。現在需要找出序列中最有價值的 段落 段落的定義是長度在 s,t 之間的連續序列。最有價值段落是指平均值最大的段落,段落的平均值 段落總價值 段落長度。輸入輸出格式 輸入格式 第一行乙個整數n,表示序列長度。第二行兩個整數s和t,...
中間數(二分) 單調佇列
1 中間數 mid.cpp c pas 問題描述 有n個整數 a1 an 任意兩個整數做絕對值差 ai aj 1 i 可以得到 n n 1 2 個絕對值差,令 m n n 1 2 保證m 一定是個偶數,求第 m 2小的數 輸入格式 輸入檔名為mid.in。第一行,乙個整數n 接下來n行,每行乙個整數...
二分答案 單調佇列 尋找段落
二分答案 單調佇列字首和維護 每次二分乙個平均值k,序列中的數全部減去k,如果序列中存在長度在 s,t 中且和超過0的子串行,則證明仍然有更大的平均值,到 mid,r 中找,反之,則到 l,mid 中找 這個操作用單調佇列維護 i s q tail 且 sum i s sum q tail 說明i ...