Codeforces Round #270

题目链接

A:我是筛了下素数。事实上偶数仅仅要输出4和x - 4,奇数输出9和x - 9就可以

B:贪心的策略,把时间排序后。取每k个的位置

C:贪心。每次遇到一个人尽量让他用字典序小的,假设不行就大的,假设还是不行就是矛盾了

D:先推断原来矩阵的对角线。和是否是对称矩阵,求出最小生成树后。dfs n次求出每两点之间的距离。然后你和原来的矩阵相比就能够了

代码:

A:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

typedef long long ll;
const ll N = 1000005;
int n, vis[N];

void get() {
	for (ll i = 2; i < N; i++) {
		if (vis[i]) continue;
		for (ll j = i * i; j < N; j += i)
			vis[j] = 1;
	}
}

int main() {
	get();
	scanf("%d", &n);
	for (int i = 2; i < n; i++) {
		if (vis[i] && vis[n - i]) {
			printf("%d %d\n", i, n - i);
			break;
		}
	}
	return 0;
}

B:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 2005;
int n, m, a[N];

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	sort(a + 1, a + n + 1);
	int ans = 0;
	for (int i = n; i >= 1; i -= m)
		ans += (a[i] - 1) * 2;
	printf("%d\n", ans);
	return 0;
}

C:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define MP(a,b) make_pair(a,b)
const int N = 100005;
typedef pair<int, int> pii;

char a[N][55], b[N][55];

int n;
pii p[N];
char sb[55];

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%s%s", a[i], b[i]);
		if (strcmp(a[i], b[i]) > 0) {
			strcpy(sb, a[i]);
			strcpy(a[i], b[i]);
			strcpy(b[i], sb);
		}
	}
	int tmp;
	for (int i = 0; i < n; i++) {
		scanf("%d", &tmp);
		p[i] = MP(i, tmp - 1);
	}
	sort(p, p + n);
	char pre[55];
	int flag = 0;
	memset(pre, 0, sizeof(pre));
	for (int i = 0; i < n; i++) {
		int id = p[i].second;
		if (strcmp(a[id], pre) > 0) {
			strcpy(pre, a[id]);
		} else if (strcmp(b[id], pre) > 0) {
			strcpy(pre, b[id]);
		} else {
			flag = 1;
			break;
		}
	}
	if (flag) printf("NO\n");
	else printf("YES\n");
	return 0;
}

D:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

typedef long long ll;
const int N = 2005;
int n, parent[N];
ll d[N][N], ans[N][N];

int find(int x) {
	return x == parent[x] ? x : parent[x] = find(parent[x]);
}

vector<int> g[N];

struct Edge {
	int u, v, d;
	Edge() {}
	Edge(int u, int v, int d) {
		this->u = u;
		this->v = v;
		this->d = d;
	}
} e[N * N];

int en = 0;

bool cmp(Edge a, Edge b) {
	return a.d < b.d;
}

void dfs(int st, int u, int f, ll sum) {
	ans[st][u] = sum;
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i];
		if (f == v) continue;
		dfs(st, v, u, sum + d[u][v]);
	}
}

bool judge() {
	for (int i = 1; i <= n; i++) {
		parent[i] = i;
		for (int j = 1; j <= n; j++) {
			if (i == j && d[i][j]) return false;
			if (i != j && !d[i][j]) return false;
			if (d[i][j] != d[j][i]) return false;
		}
	}
	for (int i = 1; i <= n; i++)
		for (int j = i + 1; j <= n; j++) {
			e[en++] = Edge(i, j, d[i][j]);
		}
	sort(e, e + en, cmp);
	for (int i = 0; i < en; i++) {
		int u = find(e[i].u);
		int v = find(e[i].v);
		if (u != v) {
			g[e[i].u].push_back(e[i].v);
			g[e[i].v].push_back(e[i].u);
			parent[u] = v;
		}
	}
	for (int i = 1; i <= n; i++) {
		dfs(i, i, 0, 0);
	}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (ans[i][j] != d[i][j]) return false;
	return true;
}

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf("%lld", &d[i][j]);
	if (judge()) printf("YES\n");
	else printf("NO\n");
	return 0;
}