20分求助
查看原帖
20分求助
667180
Assassin_HG楼主2024/3/14 15:25
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10, maxm = 3e3 + 10, Inf = 0x3f3f3f3f;
int a[maxn], b[maxm], sf[maxm], dis[maxm];
int n, m, p, nwn, ans = -1;
bool vis[maxn];
priority_queue<pair<int, int> >pq;
void dij() {
	memset(dis, Inf, sizeof dis);
	dis[0] = 0;
	pq.push({0, 0});
	while (pq.size()) {
		int x = pq.top().second;
		pq.pop();
		if (vis[x]) {
			continue;
		}
		vis[x] = 1;
		for (int i = 1; i <= nwn; ++i) {
			int nxt = x + b[i];
			if (nxt >= p) {
				nxt -= p;
			}
			if (dis[nxt] > dis[x] + b[i]) {
				dis[nxt] = dis[x] + b[i];
				pq.push({-dis[nxt], nxt});
			}
		}
	}
	return;
}
int main() {
	scanf("%d%d", &n, &m);
	p = m;
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
		if (a[i] <= m + 1) {
			printf("-1");
			return 0;
		}
		if (a[i] > p) {
			p = a[i];
		}
		for (int j = 0; j <= m; ++j) {
			if (!sf[a[i] - j]) {
				b[++nwn] = a[i] - j;
				sf[a[i] - j] = 1;
			}
		}
	}
	dij();
	for (int i = 1; i < p; ++i) {
		ans = max(ans, dis[i] - p);
	}
	printf("%d", ans);
	return 0;
}
2024/3/14 15:25
加载中...