codility MaxNotPresent
Posted KIDGINBROOK
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codility MaxNotPresent相关的知识,希望对你有一定的参考价值。
题目大意:有N个卡片,每个卡片正反都有一个数字,通过反转卡片,使得最小的没有出现在卡片上的数字最大。N的范围为 [1..100,000],数字的范围为[1..100,000,000]
1-N这N个数字,每个当作一个节点,如果一个卡片两面分别是a和b,那么a和b连边;如果a和b都大于N,那么该卡片无用;如果a和b有一个大于N,例如a,那么连边b->b,表示只能b这面朝上。建图完成后,一条边代表一个卡片,每一条边可以选择一个节点,代表哪一面朝上,因此对于每个联通集,如果无环也就是树的时候,可以调整成除了最大值之外其他的值都出现过,如果有环,那么所有的值都可以出现。代码来自fanfan。。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int N, fa[maxn], vis[maxn], mx[maxn];
int find(int x)
return x == fa[x] ? x : fa[x] = find(fa[x]);
int solution(vector<int> &A, vector<int> &B)
N = A.size();
for (int i = 1; i <= N; i++) fa[i] = i, vis[i] = 0, mx[i] = i;
for (int i = 0; i < N; i++)
int u = A[i], v = B[i];
if (u > N && v > N) continue;
if (u > N) u = v;
if (v > N) v = u;
u = find(u);
v = find(v);
if (u == v)
vis[u] = 1;
else
fa[u] = v;
vis[v] |= vis[u];
mx[v] = max(mx[v], mx[u]);
int ans = N + 1;
for (int i = 1; i <= N; i++)
if (!vis[find(i)]) ans = min(ans, mx[find(i)]);
return ans;
以上是关于codility MaxNotPresent的主要内容,如果未能解决你的问题,请参考以下文章
Codility 任务 TapEquilibrium 正确性仅为 33%
Solution to Triangle by Codility
CountNonDivisible - Codility 训练任务