• L2-026. 小字辈


    本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。

    输入格式:

    输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。

    输出格式:

    首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。

    输入样例:

    9
    2 6 5 5 -1 5 6 4 7
    

    输出样例:

    4
    1 9

    终于AC了,一波三折啊。

    比赛的时候用 队列+set 水到15分,回来自己按照比赛的思路敲了下16分。下面是代码:

    //Asimple
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll maxn = 100000 + 5;
    int n, m, res, ans, len, T, k, num, sum, t, cnt;
    bool vis[maxn];
    struct node{
        int fa;
    };
    node a[maxn];
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> n;
        queue<int> q;
        for(int i=1; i<=n; i++) {
            cin >> num;
            a[i].fa = num;
            if( num == -1 ) {
                q.push(i);
                vis[i] = true;
            } else vis[i] = false;
        }
        set<int> S;
        int cas = 0;
        while( !q.empty() ) {
            S.clear();
            while( !q.empty() ) {
                S.insert(q.front());
                q.pop();
            }
            cas ++;
            for(int i=1; i<=n; i++) if( !vis[i] ) {
                if( S.count(a[i].fa) == 1 ) {
                    q.push(i);
                } 
            }
        }
        cout << cas << endl;
        bool f = true;
        set<int>::iterator it;
        for(it=S.begin(); it!=S.end(); it++) {
            if( f ) f = false;
            else cout << " ";
            cout << *it;
        }
        cout << endl;
    }
    
    int main(){
        input();
        return 0;
    }

    emmmm,然后想了下是不是set的原因时间超限,然后直接用vector保存各个辈分的人。然后15分。。。╮(╯▽╰)╭  代码:

    //Asimple
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll maxn = 100000 + 5;
    int n, m, res, ans, len, T, k, num, sum, t, cnt;
    struct node{
        int fa;
    };
    node a[maxn];
    vector<int> re[maxn];
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> n;
        queue<int> q;
        len = 0;
        for(int i=1; i<=n; i++) {
            cin >> num;
            a[i].fa = num;
            if( num == -1 ) {
                q.push(i);
                re[len].push_back(i);
            }
        }
        
        
        while( !q.empty() ) {
            len ++;
            int T = q.size();
            while( T -- ) {
                int now = q.front(); q.pop();
                for(int i=1; i<=n; i++) {
                    if( a[i].fa == now ) {
                        q.push(i);
                        re[len].push_back(i);
                    }
                }
            }
            
        }
        cout << len << endl;
        for(int i=0; i<re[len-1].size(); i++) {
            if( i!= 0 ) cout << " ";
            cout << re[len-1][i];
        }
        cout << endl;
    }
    
    int main(){
        input();
        return 0;
    }

    仔细看了下代码,发现自己的BFS每次都要从1循环到n,emmmm,好像挺浪费时间的,不如把关系也用vector存吧,至少每次不用循环那么多次。一交20分。

    好像去年有道题目也是被vector坑了,今天还是没有想到vector。真的傻啊。

    20分代码:

    //Asimple
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll maxn = 100000 + 5;
    int n, m, res, ans, len, T, k, num, sum, t, cnt;
    vector<int> a[maxn];
    vector<int> re[maxn];
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> n;
        queue<int> q;
        len = 0;
        for(int i=1; i<=n; i++) {
            cin >> num;
            a[num].push_back(i);
            if( num == -1 ) {
                q.push(i);
                re[len].push_back(i);
            }
        }
        
        
        while( !q.empty() ) {
            len ++;
            int T = q.size();
            while( T -- ) {
                int now = q.front(); q.pop();
                for(int i=0; i<a[now].size(); i++) {
                    q.push(a[now][i]);
                    re[len].push_back(a[now][i]);
                }
            }
        }
        
        cout << len << endl;
        for(int i=0; i<re[len-1].size(); i++) {
            if( i != 0 ) cout << " ";
            cout << re[len-1][i];
        }
        cout << endl;
    }
    
    int main(){
        input();
        return 0;
    }
  • 相关阅读:
    Eclipse配置SVN的几种方法及使用详情
    python爬虫实战:基础爬虫(使用BeautifulSoup4等)
    MySQL中case when的基本用法总结
    SQL常见的一些面试题(太有用啦)
    Python应用——自定义排序全套方案
    Hadoop运维
    图形化查看maven的dependency依赖
    mac os x 10.10.3 安装protoc
    创业方向:O2O及移动社交 from 沈博阳
    手动编译安装docker环境,以及偶尔出现的bug
  • 原文地址:https://www.cnblogs.com/Asimple/p/8716539.html
Copyright © 2020-2023  润新知