zoukankan      html  css  js  c++  java
  • 2020 10 03 天梯赛

    第9题 排座位:

    开始是用二维数组求的,结果有一个样例一直没过。正确的思想是并查集。先声明一个find()函数,用来寻找每一个人的最终朋友是谁(例如1的朋友是5,5的朋友是4,那么4就是1的最终朋友),再声明一个函数用来将两个是朋友关系的人联系起来。

    代码如下:

    #include<bits/stdc++.h>

    using namespace std;

    int a[200]={0};

    int b[200][200]={0};

    int find(int n)

    {

           int m=n;

           while(1)

           {

                  if(a[m]==0)

                  {

                         return m;

                  }

                  m=a[m];

           }

    }

    void new1 (int n,int m)

    {

           int g=find(n);

           int h=find(m);

           if(g!=h)

           {

                  a[g]=h;

           }

    }

    int main()

    {

           int n,m,k,i,j;

           cin>>n>>m>>k;

           for(i=0;i<m;i++)

           {

                  int p1,p2,guanxi;

                  cin>>p1>>p2>>guanxi;

                  if(guanxi==1)

                  {

                         new1(p1,p2);

                  }

                  else

                  {

                         b[p1][p2]=1;

                         b[p2][p1]=1;

                  }

           }

           for(i=0;i<k;i++)

           {

                  int p1,p2;

                  cin>>p1>>p2;

                  if(find(p1)==find(p2)&&b[p1][p2]!=1)

                  {

                         cout<<"No problem"<<endl;

                  }

                  else if(find(p1)!=find(p2)&&b[p1][p2]==0)

                  {

                         cout<<"OK"<<endl;

                  }

                  else if(find(p1)==find(p2)&&b[p1][p2]==1)

                  {

                         cout<<"OK but..."<<endl;

                  }

                  else if(b[p1][p2]==1&&find(p1)!=find(p2))

                  {

                         cout<<"No way"<<endl;

                   }

           }

           return 0;

    }

    第11题 重排链表:

    比赛的时候照着真链表做,地址放在了指针里。

    思路:定义一个结构体,存储当前值以及下一个值的地址,输入数据后按照所给的地址进行排序,注意此时结构体的下标是地址,之后根据题目要求进行排序,再按照格式输出即可。

    代码如下:

    #include<bits/stdc++.h>

    using namespace std;

    #define ll long long

    struct node

    {

           int data;

           int next;

    };

    int main()

    {

      node h[100000+8];

      int n,i,j,k,m;

      int start;

      cin>>start>>n;

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

      {

         cin>>j>>k>>m;

         h[j].data=k;

         h[j].next=m;

      }

           int a[100000+8];

           int num=0;

           while(start!=-1)

           {

                  a[num++]=start;

                  start=h[start].next;

           } 

           int b[100000+8];

           int l=0,r=num-1;

           k=0;

           for(i=num-1,j=0;i>=j;i--,j++)

           {

                  b[k++]=a[i];

                  b[k++]=a[j];

           }

           for(i=0;i<num-1;i++)

           {

                  printf("%05d %d %05d ",b[i],h[b[i]].data,b[i+1]);

           }

           printf("%05d %d ",b[num-1],h[b[num-1]].data);

           cout<<-1<<endl;

        return 0;

    }

    第12题 分而治之:

    比赛的时候为了骗分用二维数组暴力求的,结果骗了15分。

    补题的时候研究对象一直是城市,改思路后转为研究每一条道路。先记录下每一条道路连接的两个城市,在用一个单独的数组记录这个城市是否被攻击,如果被攻击就将其置为1,这样我们最后只需要判断每一条道路上的两个城市是否有一个被攻击,如果有一个城市被攻击,那么这条道路便失灵了,如果所有的道路都失灵了,则该方案满足要求,输出“YES”,反之则输出“NO”。

    代码如下:

    #include<bits/stdc++.h>

    using namespace std;

    #define ll long long

    struct road

    {

           int c1,c2;

    };

    int main()

    {

           road croad[10000+8];

           int n,m,i,j,k,np;

           int judge[10000+8];

           cin>>n>>m;

           for(i=0;i<m;i++)

           {

                  cin>>croad[i].c1>>croad[i].c2;

           }

           cin>>k;

           while(k--)

           {

                  memset(judge,0,sizeof(judge));

                  cin>>np;

                  int flag=1;

                  for(i=0;i<np;i++)

                  {

                         int c3;

                         cin>>c3;

                         judge[c3]=1;

                  }

                  for(i=0;i<m;i++)

                  {

                         if(judge[croad[i].c1]==1||judge[croad[i].c2]==1)

                         {

                                ;

                         }

                         else

                         {

                                flag=0;

                                break;

                         }

                  }

                  if(flag==1)

                  {

                         cout<<"YES"<<endl;

                  }

                  else

                  {

                         cout<<"NO"<<endl;

                  }

           }

           return 0;

    }

  • 相关阅读:
    iOS与H5交互时,去掉调用方法时产生的警告
    技术支持网址:Technical support
    iPhone X 适配
    iOS11 上拉刷新后没有动画出现,直接瞬间出来没有停顿
    要不要去柬埔寨工作,很纠结,但是工资我又无法拒绝
    iOS10 CAAnimationDelegate的适配
    Swift3GCD
    Alamofire4.0 在 CocoaPods无法更新的问题
    8行代码全屏滑动
    bootstrap table 前端分页的问题
  • 原文地址:https://www.cnblogs.com/chengxvzhishen/p/13795384.html
Copyright © 2011-2022 走看看