枚举+剪枝TLE,54分求助
查看原帖
枚举+剪枝TLE,54分求助
576077
Feng_Jing楼主2022/10/13 19:44

求问如何优化,或者可以告诉我这样做不行

#include <bits/stdc++.h>
using namespace std;

int n, k, maxn = -1; pair<int, int> cow[4000]; vector<pair<int, int> > f;

bool cmp(pair<int, int> a, pair<int, int> b)
{
	if (a.first != b.first) return a.first > b.first; else return a.second > b.second;
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d%d", &cow[i].first, &cow[i].second);
	f.clear(); f.push_back(make_pair(0, 0));
	for (int i = 1; i <= n; i++)
	{
		k = f.size();
		for (int j = k; j <= k * 2 - 1; j++)
			f.push_back(make_pair(f[j - k].first + cow[i].first, f[j - k].second + cow[i].second));
		sort(f.begin(), f.end(), cmp);
		for (int j = 1; j <= f.size() - 1; j++)
			if (f[j].first <= f[j - 1].first && f[j].second <= f[j - 1].second)
				f.erase(f.begin() + j);
	}
	for (int i = 0; i <= f.size() - 1; i++)
		if (f[i].first >= 0 && f[i].second >= 0) maxn = max(maxn, f[i].first + f[i].second);
	printf("%d\n", maxn);
	return 0;
}
2022/10/13 19:44
加载中...