• 2020 10 17 天梯赛


    7-9 小字辈:

    开始使用并查集暴力做的,结果超时。

    正确思路:

    用嵌套的vector存储每个人的下一辈有谁,之后记录祖宗,再dfs。

    之前学STL的时候没学vector,之前学习的dfs也差不多忘了,通过这道题再复习了一下。

    代码如下:

    #include<bits/stdc++.h>

    using namespace std;

    #define ll long long

    vector<vector<int>>h;

    set<int>u;

    set<int>::iterator p;

    int mmax=-1;

    void dfs(int person,int heaght)

    {

        if(heaght>mmax)

        {

            mmax=heaght;

            u.clear();

            u.insert(person);

        }

        else if(heaght==mmax)

        {

            u.insert(person);

        }

        for(int i=0;i<h[person].size();i++)

        {

            dfs(h[person][i],heaght+1);

        }

    }

    int main()

    {

        int n,i,j,k;

        cin>>n;

        h.resize(n+1);

        int ancestor;

        for(i=1;i<=n;i++)

        {

            cin>>j;

            if(j==-1)

            {

                ancestor=i;

            }

            else

            {

                h[j].push_back(i);

            }

        }

       // int heaght=0;

         dfs(ancestor,1);

         cout<<mmax<<endl;

        for(p=u.begin();p!=u.end();p++)

        {

            if(p==u.begin())

            {

                cout<<*p;

            }

            else

            {

                cout<<" "<<*p;

            }

        }

        return 0;

    }

    7-10 抢红包:

    WA在第一个点半天,上网查了后才知道要先以分为单位进行加减,最后再×0.01,不然会造成结构体排序错误。。。。。

    避免高精度加减。

    代码如下:

    #include<bits/stdc++.h>

    using namespace std;

    struct f

    {

           int num;

           double money=0;

           int sum=0;

    }per[10000+8];

    bool cmp(f i,f j)

    {

        if(i.money==j.money)

           {

                  return i.sum>j.sum;

           }

           if(i.sum==j.sum&&i.money==j.money)

           {

                  return i.num<j.num;

           }

           return i.money>j.money;

    }

    int main()

    {

        int n,i,j,k;

        float y;

        cin>>n;

        for(i=1;i<=n;i++)

        {

               float tem=0;

               per[i].num=i;

               cin>>k;

               while(k--)

               {

                      cin>>j>>y;

                      tem+=y;

                      per[j].money+=y;

                      per[j].sum++;

                  }

                  per[i].money-=tem;

           }

           //cout<<fixed<<setprecision(5)<<"5:"<<" "<<per[5].money<<" "<<per[5].num<<" "<<per[5].sum<<endl;

           //cout<<"10:"<<" "<<per[10].money<<" "<<per[10].num<<" "<<per[10].sum<<endl;

           sort(per+1,per+n+1,cmp);

           for(i=1;i<=n;i++)

           {

                  cout<<per[i].num<<' ';

                  cout<<fixed<<setprecision(2)<<per[i].money/100<<endl;

           }

        return 0;

    }

    7-12深入虎穴:

    开始也是用并查集暴力解的,结果超时,受上面7-9的启发,改用vector的嵌套加dfs,先把每个节点的子节点存储起来,然后找出根节点,再dfs每个节点的子节点,找出最深的那一个即可。

    需要注意的是vector在使用前需要初始化:v.resize(n+1);

    代码如下:

    #include<iostream>

    #include<set>

    #include<vector>

    using namespace std;

    vector<vector<int>>v;

    //vector<vector<int>>h;

    int a[100000+8]={0};

    set<int>s;

    int mmax=-1;

    void dfs(int u,int heaght)

    {

        if(heaght>mmax)

        {

            mmax=heaght;

            s.clear();

            s.insert(u);

        }

        for(int i=0;i<v[u].size();i++)

        {

            dfs(v[u][i],heaght+1);

        }

    }

    int main()

    {

        int n,i,j,k,root;

        cin>>n;

        v.resize(n+1);

        for(i=1;i<=n;i++)

        {

            cin>>k;

            while(k--)

            {

                cin>>j;

                v[i].push_back(j);

                //h[j].push_back(i);

                a[j]=1;

            }

        }

        for(i=1;i<=n;i++)

        {

            if(a[i]==0)

            {

                root=i;

                break;

            }

        }

        int heaght;

        dfs(root,1);

        //out<<mmax<<endl;

        set<int>::iterator p;

        p=s.begin();

        cout<<*p<<endl;

        return 0;

    }

  • 相关阅读:
    GJM :动作手游实时PVP 帧同步(客户端)[转载]
    GJM :多人在线游戏的设计思路
    GJM : 中断被Socket.Accept阻塞的线程
    GJM :异步Socket [转载]
    GJM :C#开发 异步处理是目的,多线程是手段
    GJM : FlatBuffers 与 protobuf 性能比较 [转载 ]
    GJM : Protobuf -NET 相比Json 传输速度只需要1/3 解析只需要1/10
    GJM : Unity3D结合ZXING制作二维码识别
    GJM : Unity3D 常用网络框架与实战解析 【笔记】
    javascripct数组
  • 原文地址:https://www.cnblogs.com/chengxvzhishen/p/13873556.html
Copyright © 2020-2023  润新知