#1,2,4,5,8,9,10,11,14 WA 求助,悬赏一关
查看原帖
#1,2,4,5,8,9,10,11,14 WA 求助,悬赏一关
1062532
MinLand楼主2024/5/27 12:51

提交记录

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
using ull = unsigned ll;

ll read();

const ll N = 500 + 114;

int n;
int x[N], y[N];
vector<ll>g[N];
ll d[N], sum = 0, f[N];
ll calc_dis_Pow(int a, int b) {
	return  (x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]);
}


void dfs(int u) {
	for (ll v : g[u]) {
		if (!d[v] or d[v] >= d[u] + 1) {
			d[v] = d[u] + 1;
			dfs(v);
		}
	}
	return;
}


int main() {
	n = read();
	x[0] = 0, y[0] = 0;
	for (int i = 1; i <= n; i++) {
		x[i] = read(), y[i] = read();
	}

	for (int i = 1; i <= n; i++) {
		ll min_dis = -1, min_num = 0;
		for (int j = 0; j <= n; j++) {
			if (i == j) continue;
			ll t = calc_dis_Pow(i, j);
			if ( t < min_dis or min_dis == -1)
				min_dis = t, min_num = j;
		}
		g[i].push_back(min_num);
		g[min_num].push_back(i);
	}//建图

	d[0] = 1;
	dfs(0);


	for (int i = 0; i <= n; i++)
		sum += d[i];
	if (sum % 2 == 1) {
		printf("No\n");
		return 0;
	}
	ll mid = sum >> 1;
	for (int i = 0; i <= n; i++) {
		for (int j = mid; j >= d[i]; j--) {
			f[j] = max(f[j], f[j - d[i]] + d[i]);
		}
	}
	if (f[mid] == mid)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}

ll read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (!isdigit(c))f = c == '-' ? -1 : f, c = getchar();
	while (isdigit(c))x = x * 10 + c - '0', c = getchar();
	return x * f;
}

谢谢了!

2024/5/27 12:51
加载中...