UVa 714 抄書(貪心 二分)

2022-06-20 23:30:26 字數 1214 閱讀 9854

題意:把乙個包含m個正整數的序列劃分成k個非空的連續子串行,使得每個正整數恰好屬於乙個序列。設第i個序列的各數之和為s(i),你的任務是讓所有s(i)的最大值盡量小。

思路:「最大值盡量小」問題。

區間的範圍肯定是所有數中最大的乙個至所有數之和,我們可以使用二分法來確定這樣的乙個值x,x盡量小並且每個區間都不大它。

題目要求的是前面的區間盡量小,那我們就需要貪心一下,從右邊的數開始分配區間。需要注意的是,如果當前剩下來的待分配區間的數正好等於還要分配的組數,那麼前面的幾個數每個數都為乙個區間。

1 #include2 #include

3 #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...