我的代码在洛谷AC了但是在一本通1278没有通过,是哪里有问题呢?
查看原帖
我的代码在洛谷AC了但是在一本通1278没有通过,是哪里有问题呢?
1337110
wownmsl1楼主2024/10/26 13:51

因为题目要求:“如果有多解,则尽可能让前面的人少抄写。” 所以我先找到分给k个人,最多的人抄写多少,然后再记录g数组,最后递归倒序输出。 但是

我的代码在洛谷AC了,但是在一本通1278:【例9.22】复制书稿(book)测试点6没有通过,是哪里有问题呢?

#include<bits/stdc++.h>
using namespace std;
int m,k;
int a[505],b[505],c[505];
int dp[505][505];
int g[505][505];
void show(int x,int y)
{
	if(g[x][y]==0)
	{
		cout<<1<<" "<<x<<endl;
		return ;
	}
	show(g[x][y],y-1);
	cout<<g[x][y]+1<<" "<<x<<endl;
}
int main()
{
	cin>>m>>k;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
		b[i]=b[i-1]+a[i];
		c[i]=max(a[i],c[i-1]);
	}
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=k;i++)
	{
		dp[i][i]=c[i];
		g[i][i]=i-1;
	}
	for(int i=1;i<=m;i++)
	{
		dp[i][1]=b[i];
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<i&&j<=k;j++)
		{
			for(int q=1;q<i;q++)
			{
				if(dp[i][j]>max(dp[q][j-1],b[i]-b[q]))
				{
					dp[i][j]=max(dp[q][j-1],b[i]-b[q]);
				}
			}
		}
	}
	int maxx=dp[m][k];
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=k;i++)
	{
		dp[i][i]=c[i];
		g[i][i]=i-1;
	}
	for(int i=1;i<=m;i++)
	{
		dp[i][1]=b[i];
	}
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<i&&j<=k;j++)
		{
			for(int q=i-1;q>=1;q--)
			{
				if(max(dp[q][j-1],b[i]-b[q])<=maxx)
					g[i][j]=q;
				if(dp[i][j]>max(dp[q][j-1],b[i]-b[q]))
				{
					dp[i][j]=max(dp[q][j-1],b[i]-b[q]);
					if(g[i][j]==0)
						g[i][j]=q;
				}
			}
		}
	}
	show(m,k);
}
2024/10/26 13:51
加载中...