66 pts 求调 WA 5# 7# 9#
查看原帖
66 pts 求调 WA 5# 7# 9#
798773
edward1346楼主2024/11/28 16:06

f(i,j)f(i,j) 表示前 ii 本书 jj 个人抄的最短时间。

方案是对的,但是不符合字典序。

麻烦各位大佬了!谢谢。

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";
}
2024/11/28 16:06
加载中...