zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/chengxvzhishen/p/13873556.html
Copyright © 2011-2022 走看看