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;
}