uva 714——Copying Books
生活随笔
收集整理的這篇文章主要介紹了
uva 714——Copying Books
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:把一個m個整數的序列劃分成k個連續非空的子序列,使得子序列和的最大值最小。
思路:二分。遇到最大值最小大多都二分了,讓劃分的子序列都不超過x,根據x來judge最終結果k個是多還是少,然后二分來調整x直到出現k個序列。
code:
#include <bits/stdc++.h> using namespace std;typedef long long ll; #define int long long ll m,k,v[505],c[505]; bool judge(ll x) {ll p=0,q=0;for (int i=0;i<m;i++){p+=v[i];if (v[i]>x) return false;if (p>x){p=v[i];q++;}}if (q>k-1) return false;return true; }main() {int T;scanf("%d",&T);while (T--){int s=0,len;memset(c,0,sizeof(c));scanf("%lld %lld",&m,&k);for (int i=0;i<m;i++) scanf("%lld",&v[i]),s+=v[i];int l=0,r=s,mid;while (l<r){mid=l+(r-l)/2;if (!judge(mid)) l=mid+1;else r=mid;}len=s=0;for (int i=m-1;i>=0;i--){s+=v[i];if (s>r||k-len==i+2){s=v[i];c[len++]=i;}}len=k-2;for (int i=0;i<m;i++){printf("%lld",v[i]);if (i!=m-1) printf(" ");if (len>=0&&i==c[len]) printf("/ "),len--;}puts("");} }總結
以上是生活随笔為你收集整理的uva 714——Copying Books的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uva 12627——Erratic E
- 下一篇: 子宫内膜厚度5mm算很薄吗