码迷,mamicode.com
首页 > 其他好文 > 详细

2020 10 17 天梯赛

时间:2020-10-26 11:18:47      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:cto   name   root   复习   记录   def   开始   sort   clear   

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 天梯赛

标签:cto   name   root   复习   记录   def   开始   sort   clear   

原文地址:https://www.cnblogs.com/chengxvzhishen/p/13873556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!