题意:输入t表示有多个样例,输入n,group表示有n个数分为group组使每组和最小
输出‘/’时注意格式。
#include<iostream> #include<string.h> using namespace std; #define ll long long const int N = 500 + 5; ll a[N]; int vis[N]; ll num,m,group; int solve(int d) { ll sum=0; int k=1; for(int i=0;i<num;i++) { if(a[i]+sum<=d) sum+=a[i]; else { sum=a[i]; k++; } } if(k<=group) return 1; else return 0; } void out() { memset(vis,0,sizeof(vis)); int k=1; ll sum=0; for(int i=num-1;i>=0;i--)//从后开始确定‘/’的位置 { if(sum+a[i]<=m) { sum+=a[i]; } else//确定划分的位置 { k++; sum=a[i]; vis[i]=1; } } for(int i=0;i<num&&k<group;i++)//输出‘/’可能小于需要的分组数,从前向后增加分组 { if(!vis[i]) { vis[i]=1; k++; } } for(int i=0;i<num-1;i++) { cout<<a[i]<<" "; if(vis[i]) cout<<"/ "; } cout<<a[num-1]<<endl; } int main() { int t; scanf("%d",&t); while(t--) { ll sum=0;m=0; cin>>num>>group; for(int i=0;i<num;i++) { cin>>a[i]; sum+=a[i]; if(m<a[i]) m=a[i]; } int mid=(m+sum)/2; while(sum>m) { if(solve(mid)) { sum=mid; } else m=mid+1; mid=(sum+m)/2; } // cout<<mid<<endl; out(); } return 0; }