一開始是一眼看出是二分的,因為這裡有單調性,因為取錢是一次取完並且是連續的。
所以最優取法就是準備達到某個價值再取。最優裡邊包含了次優,也就是取不到m次我就能取完就一定能夠取m次能夠取完,只要在取法那裡隨便取就行了,保證不超過這個某個價值
於是我們可以二分這個價值,看看能不能最優法取完並且次數小於m。
#include #include #include #include #include #include using namespace std;#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define cc(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n)
inline const int getint()
inline const int max(const int &a, const int &b)
inline const int min(const int &a, const int &b)
return 1;
}int main()
int l=mx, r=sum, mid;
while(l<=r)
print(r+1);
return 0;
}
因為範圍很大,所以我們二分的範圍要適當做點技巧。
描述 description
高考結束後,同學們大都找到了乙份臨時工作,渴望掙得一些零用錢。從今天起,matrix67將連續工作n天(1<=n& lt;=100 000)。每一天末他可以領取當天及前面若干天裡沒有領取的工資,但他總共只有m(1<=m<=n)次領取工資的機會。 matrix67已經知道了在接下來的這n天裡每一天他可以賺多少錢。為了避免自己濫用零花錢,他希望知道如何安排領取工資的時間才能使得領到工資最多的 那一次工資數額最小。注意matrix67必須恰好領工資m次,且需要將所有的工資全部領走(即最後一天末需要領一次工資)。
輸入格式 inputformat
第一行輸入兩個用空格隔開的正整數n和m
以下n行每行乙個不超過10000正整數,依次表示每一天的薪水。
輸出格式 outputformat
輸出領取到的工資的最大值最小是多少。
樣例輸入 sampleinput [複製資料]
7 5100400
300100
500101
400
樣例輸出 sampleoutput [複製資料]
500
資料範圍和注釋 hint
【樣例說明】
採取下面的方案可以使每次領到的工資不會多於500。這個答案不能再少了。
100 400 300 100 500 101 400 每一天的薪水
<------1 <-------2 <---3 <---4 <---5 領取工資的時間
500 400 500 101 400 領取到的工資
二分答案 收入計畫
問題描述 高考結束後,同學們大都找到了乙份臨時工作,渴望掙得一些零用錢。從今天起,matrix67將連續工作n天。每一天末他可以領取當天及前面若干天裡沒有領取的工資,但他總共只有m次領取工資的機會。matrix67已經知道了在接下來的這n天裡每一天他可以賺多少錢。為了避免自己濫用零花錢,他希望知道如...
hive計畫(二)分割槽
使用hive e 可以執行多條語句 hive e sentence1 sentence2 進入hive 後檢視當前路徑 pwd hive 介面使用命令檢視hdfs路徑 dfs ls 使用desc可以檢視表的資訊 desc 檢視分割槽表的分割槽資訊 show partitions一般分割槽資訊不存在於...
Tyvj1655 遊樂園 二分查詢
題意 有n 1e10 個人,每個人會坐當前空閒的,編號最小的飛機 1000 對於第i個飛機,任意人的乘坐時間為si。n的數量很驚人,不能模擬,所以第一次我考慮從m下手,又怎麼做呢?dp 貪心 似乎無從下手。正解 可以發現坐飛機的時間是有規律的,那麼這就意味著如果確定了時間,可以在o m 的時間內求出...