C - Copying Books (POJ - 1505)
阿新 • • 發佈:2018-02-14
blog div 最小值 book 標記 有一個 bool out 輸出
- 題目大意
有m本書,k個人來抄,每本書有一個書本頁數;求使得k個人抄完的最大頁數最小,並且每個人都至少要抄一本,然後輸出抄書的方案 。
- 解題思路
這是個最大值中的最小值問題,先用二分+貪心算出一個最大頁數的最小值(在二分的過程中,我們對於當前考慮的值 x 劃分人數的貪心過程中,我們就有flag[i]去標記,這個位置應該劃分開即可)。
- 代碼
#include<iostream> #include<cstring> using namespace std; const int MAX = 501; int num[MAX]; bool vis[MAX]; int t, n,g; int find(long long a) { long long sum = 0, count = 1; memset(vis, false, sizeof(vis)); for (int i = n - 1; i >= 0; i--) { sum += num[i]; if (sum > a) { count++; sum = num[i]; vis[i] = true; } } return count; } int main() { cin >> t; while (t--) { int max = 0; cin >> n>>g; long long l = 0, r = 0; for (int i = 0; i < n; i++) { cin >> num[i]; if (num[i] > l) l = num[i]; r+= num[i]; } long long m; while (l < r) { m = (l + r) / 2; if (find(m) <= g) r = m; else { l = m + 1; } } max=find(r); for (int i = 0; i < n&&max < g; i++) { if (!vis[i]) { vis[i] = true; max++; } } cout << num[0]; for (int i = 1; i < n; i++) { if (vis[i - 1]) cout << " /"; cout << ‘ ‘ << num[i]; } cout << endl; } return 0; }
C - Copying Books (POJ - 1505)