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\n",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;

}

posted @ 2020-10-10 21:30  chengxvzhishen  阅读(113)  评论(0编辑  收藏  举报