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