2020 10 17 天梯赛

Posted chengxvzhishen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

}

以上是关于2020 10 17 天梯赛的主要内容,如果未能解决你的问题,请参考以下文章

天梯赛选拔2020.3.3

PTA 程序设计天梯赛(1~20题)

PTA 程序设计天梯赛(161~180题)

天梯赛座位分配

c++天梯赛L2-039 清点代码库 (25 分)天梯赛c++附详细注释

2019天梯赛第三次训练赛