2020-8-8 模拟赛补题

PTA 7-10 排座位
这道题中,因为朋友关系是可以传递的,所以我们用并查集来储存朋友关系。敌对关系不可传递,所以我们用一个邻接表储存敌对关系。再根据题目要求进行输出

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>

using namespace std;

int pre[1010];
int Map[1010][1010];

//并查集模板
int Find(int x)
{
    while(x!=pre[x])
        x = pre[x];
    return x;
}

void Merge(int x,int y)
{
    int fx = Find(x);
    int fy = Find(y);
    if(fx!=fy)
        pre[fx] = fy;
}

int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    memset(Map,0,sizeof(Map));
    for(int i=1;i<=n;i++)//初始化
        pre[i] = i;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        if(c==-1)//储存敌对关系
            Map[a][b] = Map[b][a] = -1;
        else//朋友关系用并查集处理
            Merge(a,b);
    }
    for(int i=1;i<=k;i++)
    {
        int x,y;
        cin>>x>>y;
        int fx = Find(x);
        int fy = Find(y);
        //根据题目要求输出
        if(fx==fy&&Map[x][y]!=-1)
            cout<<"No problem"<<endl;
        if(fx==fy&&Map[x][y]==-1)
            cout<<"OK but..."<<endl;
        if(fx!=fy&&Map[x][y]!=-1)
            cout<<"OK"<<endl;
        if(fx!=fy&&Map[x][y]==-1)
            cout<<"No way"<<endl;
    }
    return 0;
}

PTA 7-4 帅到没朋友
我们用一个vis数组作为标记数组,当朋友圈人数大于1时,我们将输入的数标记,如果朋友圈人数等于1说明朋友圈只有自己一人,我们不做标记

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>

using namespace std;

const int N = 100100;
int vis[N];//标记数组

int main()
{
    int n,m,k,num;
    memset(vis,0,sizeof(vis));//初始化
    cin>>n;
    while(n--)
    {
        cin>>k;
        if(k>1)//朋友圈不止自己本人
        {
            for(int i=1; i<=k; i++)
            {
                cin>>num;
                vis[num] = 1;
            }
        }
        else//朋友圈只有自己一人或者没有朋友圈
            cin>>num;

    }
    int sum = 0;
    cin>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>num;
        if(!vis[num])
        {
            vis[num] = 1;
            if(sum)
                cout<<" ";
            printf("%05d",num);//注意是输出五位
            sum++;
        }
    }
    if(!sum)
        cout<<"No one is handsome"<<endl;
    return 0;
}

PTA 7-11 玩转二叉树

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>

using namespace std;

int str1[30],str2[30];

struct node
{
    int data;
    struct node *l;
    struct node *r;
};

struct node *creat(int n,int *str1,int *str2)
{
    if(n==0)
        return NULL;
    int i;
    struct node *root;
    root = (struct node*)malloc(sizeof(struct node));
    root -> data = str1[0];
    for(i=0; i<n; i++)
    {
        if(str2[i]==str1[0])
            break;
    }
    root -> l = creat(i,str1+1,str2);
    root -> r = creat(n-i-1,str1+i+1,str2+i+1);
    return root;
};

void Swap(struct node *root)
{
    struct node *p;
    if(root!=NULL)
    {
        if(root->l!=NULL||root->r!=NULL)
        {
            p = root->r;
            root->r = root->l;
            root->l = p;
        }
    }
    else
        return ;
    Swap(root->l);
    Swap(root->r);
}

void ans(struct node *root)
{
    struct node *s[55];
    if(root)
    {
        int i=0,j=0;
        s[j++]=root;
        while(i<j)
        {
            if(s[i])
            {
                s[j++]=s[i] -> l;
                s[j++]=s[i] -> r;
                if(s[i]==root)
                    printf("%d",s[i]->data);
                else
                    printf(" %d",s[i] -> data);
            }
            i++;
        }
    }
}

int main()
{
    int n;
    struct node *root;
    cin>>n;
    for(int i=0; i<n; i++)
        cin>>str2[i];
    for(int i=0; i<n; i++)
        cin>>str1[i];
    root = creat(n,str1,str2);
    Swap(root);
    ans(root);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值