題意:把乙個包含m個正整數的序列劃分成k個非空的連續子串行,使得每個正整數恰好屬於乙個序列。設第i個序列的各數之和為s(i),你的任務是讓所有s(i)的最大值盡量小。
思路:「最大值盡量小」問題。
區間的範圍肯定是所有數中最大的乙個至所有數之和,我們可以使用二分法來確定這樣的乙個值x,x盡量小並且每個區間都不大它。
題目要求的是前面的區間盡量小,那我們就需要貪心一下,從右邊的數開始分配區間。需要注意的是,如果當前剩下來的待分配區間的數正好等於還要分配的組數,那麼前面的幾個數每個數都為乙個區間。
1 #include2 #include3 #include4
using
namespace
std;56
const
int maxn = 10000000 + 5;7
intn, m;
8long
long
_max,left,right,_min;910
inta[maxn];
11int ans[510
];12
1314
bool judge(long
long mid) //
判斷能否每組都小於等於mid
1526
else
27 sum +=a[i];28}
29return
true;30
}3132void
solve()
3343
else ::left = mid + 1;44
}45long
long sum = 0;46
int count = 1;47
for (int i = n - 1; i >= 0; i--)
4855
else
56 sum +=a[i];
57if (m - count == i + 1) //
如果剩下來的值數量正好等於要劃分的組數,那麼乙個數為一組
5863}64
for (int i = 0; i < n - 1; i++)
6569 cout << a[n - 1] <7071}72
73int
main()
7489
solve();90}
91return0;
92 }
uva 714 貪心 二分
include using namespace std const int maxm 500 int k,m,p maxm bool solve int ans else pre p i return kr k void print int ans else pre p i for int i 0 ...
UVA 714 二分最大化最小值
題意 輸入t表示有多個樣例,輸入n,group表示有n個數分為group組使每組和最小 輸出 時注意格式。include include using namespace std define ll long long const int n 500 5 ll a n intvis n ll num,...
JZOJ 二分 抄書
與書的複製差不多 洛谷 書的複製 但是只要輸出最大的時間 樣例輸入9 3 100 200 300 400 500 600 700 800 900樣例輸出1700樣例解釋1 1500 100 200 300 400 500 2 1300 600 700 3 1700 800 900 1300 1500...