66求调
查看原帖
66求调
1298492
zhaoyonghao楼主2024/8/28 08:17
#include <bits/stdc++.h>
using namespace std;

int a[505], f[505][505], s[505];//f[i][j]=前j个人抄前i本书的最小时间 
vector < int > ans[505][505];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	memset(f, 0x3f, sizeof f);
	for (int i = 1; i <= n; i++)
		s[i] = s[i - 1] + a[i];
	for (int i = 1; i <= n; i++)
	{
		f[i][1] = s[i];
		ans[i][1].push_back(i);
	}
	for (int i = 2; i <= n; i++)
		for (int j = 2; j <= m && j <= i; j++)
		{
			int wz = -1;
			for (int k = j - 1; k < i; k++)
			{
				if (max(f[k][j - 1], s[i] - s[k]) < f[i][j])
				{
					f[i][j] = max(f[k][j - 1], s[i] - s[k]);
					wz = k;
				}
			}
			if (wz != -1)
			{
				for (auto k : ans[wz][j - 1])
					ans[i][j].push_back(k);
			}
			ans[i][j].push_back(i);
		}
	cout << 1 << " " << ans[n][m][0] << "\n";
	for (int i = 1; i < ans[n][m].size(); i++)
		cout << ans[n][m][i - 1] + 1 << " " << ans[n][m][i] << "\n";
	return 0;
}
2024/8/28 08:17
加载中...