58分求调
查看原帖
58分求调
1591487
Eason_hao楼主2025/6/30 12:28
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, p, q, a[24][24], s[24][24], sum[24], f[24];
int l, r, mid, flag, num, res, ans = 1e18;
bool check(int x)
{
	memset(sum, 0, sizeof sum);
	num = 0;
	for (int i = 1; i <= m; i++)
	{
		flag = 0;
		for (int j = 1; j <= p; j++)
		{
			if (s[i][f[j]] - s[i][f[j - 1]] > x) return 0;
			sum[j] += s[i][f[j]] - s[i][f[j - 1]];
			if (sum[j] > x) flag = 1;
		}
		if (flag || i == m)
		{
			if (++num > q) return 0;
			for (int j = 1; j <= p; j++)
				sum[j] = s[i][f[j]] - s[i][f[j - 1]];
		}
	}
	return 1;
}
void solve()
{
	l = 0, r = 1e18, res = 1e18;
	while (l <= r)
	{
		mid = (l + r) >> 1;
		if (check(mid)) res = mid, r = mid - 1;
		else l = mid + 1;
	}
	ans = min(ans, res);
}
void dfs(int x, int k)
{
	if (x == p) {f[x] = n; solve(); return;}
	for (int i = k + 1; i < n; i++)
	{
		f[x] = i;
		dfs(x + 1, i);
	}
}
signed main()
{
	cin >> n >> m >> p >> q;
	p++, q++;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			cin >> a[i][j];
			s[j][i] = s[j][i - 1] + a[i][j];
		}
	dfs(1, 0);
	cout << ans;
	return 0;
}
2025/6/30 12:28
加载中...