f(i,j) 表示前 i 本书 j 个人抄的最短时间。
方案是对的,但是不符合字典序。
麻烦各位大佬了!谢谢。
5#样例输入:
10 4
1 1 1 1 1 1 1 1 1 1
正确输出:
1 1
2 4
5 7
8 10
我的输出:
1 2
3 4
5 7
8 10
(显然字典序不符,但是特叛过了字典序还是这样)
劳烦各位大佬了!
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[501],s[501];
int f[501][501];
int fa[501][501];
int l[502];
void print(int x,int y)
{
if(y>=1)
{
if(fa[x][y])
{
l[y]=fa[x][y]+1;
print(fa[x][y],y-1);
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
}
memset(f,0x3f,sizeof f);
f[0][0]=0;
fa[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
for(int k=j-1;k<i;k++)
{
if(max(f[k][j-1],s[i]-s[k])<f[i][j]||(max(f[k][j-1],s[i]-s[k])==f[i][j]&&k<fa[i][j]))
{
f[i][j]=max(f[k][j-1],s[i]-s[k]);
fa[i][j]=k;
}
}
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=i;j++)
// cout<<f[i][j]<<" ";
// cout<<endl;
// }
// cout<<f[n][m]<<endl;
print(n,m);
l[m+1]=n+1;
l[1]=1;
for(int i=1;i<=m;i++)
cout<<l[i]<<" "<<l[i+1]-1<<"\n";
}