原题链接:https://vjudge.net/problem/UVA-714
分类:二分法
备注:二分找上限,贪心求答案
#include<bits/stdc++.h>
using namespace std;
const int maxm=500+5;
typedef long long ll;
int n,m,k;
ll a[maxm],sum[maxm];
bool check(ll x){
int bf=1,pos=1;
for(int i=1;i<=k;i++){
while(pos<=m&&(sum[pos]-sum[bf-1]<=x))pos++;
//printf("pos=%d bf=%d,sum=%d\n",pos-1,bf,sum[pos-1]-sum[bf-1]);
bf=pos;
}
if(pos>m)return true;
else return false;
}
int main(void){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&n);
while(n--){
scanf("%d %d",&m,&k);
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
ll L=1,R=sum[m],mid=(L+R)>>1;
while(L<R){
if(check(mid))R=mid-1;
else L=mid+1;
mid=(L+R)>>1;
}
ll ans=L;
int s[maxm],bf=m,pos=m;
for(ll i=L-3;i<=L+3;i++)if(check(i)){ans=i;break;}
for(int i=k;i>=1;i--){//在pos的前面画一条线
while(pos>=i&&sum[bf]-sum[pos-1]<=ans)pos--;
bf=pos; s[i]=pos+1;
}
pos=1;
for(int i=2;i<=k;i++){
while(pos<s[i])printf("%d ",a[pos]),pos++;
printf("/ ");
}
while(pos<=m)printf("%d%c",a[pos],pos==m?'\n':' '),pos++;
}
return 0;
}