4135 月度開銷

2021-08-19 17:25:40 字數 1301 閱讀 6167

題目:

描述農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 n (1 ≤ n ≤ 100,000) 天裡每天需要的開銷。

約翰打算為連續的m (1 ≤ m ≤ n) 個財政週期建立預算案,他把乙個財政週期命名為fajo月。每個fajo月包含一天或連續的多天,每天被恰好包含在乙個fajo月裡。

約翰的目標是合理安排每個fajo月包含的天數,使得開銷最多的fajo月的開銷盡可能少。

輸入第一行包含兩個整數n,m,用單個空格隔開。

接下來n行,每行包含乙個1到10000之間的整數,按順序給出接下來n天裡每天的開銷。輸出乙個整數,即最大月度開銷的最小值。樣例輸入

7 5

100400

300100

500101

400

樣例輸出
500
提示

若約翰將前兩天作為乙個月,第

三、四兩天作為乙個月,最後三天每天作為乙個月,則最大月度開銷為500。其他任何分配方案都會比這個值更大。

思路:此題目應該使用二分法來求解,唯一的難點就是確認left和right,可以極限思考:把每一天都當成乙個月 或者 把全部都當成乙個月 來看待,所以left可以是所有天數裡面開銷最大的(第一種情況),right是開銷的總和(第二種情況)

ac**:

/**

採用二分的辦法。

極限思考:left是所有天數裡面最大開銷的(即把每一天當成乙個月)

right是開銷總和(即把全部當成乙個月)

**/#include using namespace std;

int arr[100011],n,m;

bool istrue(int min);//最大月開銷的最小值

int main()

int result ;

int left = max,right = total,mid;//左邊(每一天都當成乙個月),右邊(所有天數當成乙個月)

while(left <= right)

else

left = mid+1;//擴大範圍

} cout << result;

return 0;

} bool istrue(int min)

else

sum +=arr[i];

} if(month <= m)//假設的情況下月份不會超過規定的月份數

return true;

else//超過

return false;

}

4135 月度開銷

農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 n 1 n 100,000 天裡每天需要的開銷。約翰打算為連續的m 1 m n 個財政週期建立預算案,他把乙個財政週期命名為fajo月。每個fajo月包含一天或連續的多天,每天被恰好包含在乙個faj...

4135 月度開銷(二分查詢)

總時間限制 1000ms 記憶體限制 65536kb 描述農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 n 1 n 100,000 天裡每天需要的開銷。約翰打算為連續的m 1 m n 個財政週期建立預算案,他把乙個財政週期命名為fajo月。每個...

1243月度開銷

農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 n 1 n 100,000 天裡每天需要的開銷。約翰打算為連續的m 1 m n 個財政週期建立預算案,他把乙個財政週期命名為fajo月。每個fajo月包含一天或連續的多天,每天被恰好包含在乙個faj...