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 训练任务

Solution of NumberOfDiscIntersections by Codility

需要解决的 Codility 测试

the solution of CountNonDivisible by Codility