1. 程式人生 > >Copying Books(二分查詢)

Copying Books(二分查詢)

在挑戰程式設計競賽上做過類似的,二分答案判斷是否合理。

#include <cstdio>
#include <stack>
using namespace std;
typedef long long LL;

const int maxn = 510;
LL a[maxn];
stack <LL> p[maxn];
int m,k;

bool ok(LL ans) {
    int pos=m,t=k;
    while(t--){
        LL cur=ans;
        while(cur>a[pos]){
            cur-=a[pos--];
            if
(!pos) return true; } } return !pos; } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d%d", &m, &k); LL l = 0, r = 6000000000; for(int i = 1; i <= m; ++i) scanf("%lld", &a[i]), l = max(l, a[i]); LL mid = (l + r) / 2; while
(l < r) { mid = l + (r - l) / 2; if(ok(mid)){ if(!ok(mid - 1)){--mid; break;} else r = mid + 1; } else l = mid; } if(ok(l)) mid = l; int pos = m; for(int i = k; i > 0; --i){ while
(!p[i].empty()) p[i].pop(); LL t = mid; while(t >= a[pos] && pos) { t-=a[pos], p[i].push(a[pos--]); if(pos < i) break; } } for(int i = 1; i <= k; ++i) { while(!p[i].empty()){ printf("%lld", p[i].top()), p[i].pop(); if(!p[i].empty()) printf(" "); } printf(i == k ? "\n" : " / "); } } return 0; }