PAT.Basic.1065.单身狗! Single Dog!

函数max的就是一个经典排序。
这道题的精髓在于
couple[woman]=man;
couple[man]=woman;
相当于一个函数,y=f(x). 男生(x)对应的配偶女生(y)
这样就很方便的从嘉宾里把单身狗区分出来【笑】
接下来就是导入嘉宾guest[i].
导入嘉宾的时候你可以直接判断couple[guest[i]]!=-1
这个意思是,嘉宾的ID对应的他的couple【配偶】是否存在,如果存在,那么执行下一条语句。 list[couple[guest[i]]]=1; 这条语句的意思就是将他的配偶列入一个清单中。
例如输入
2
1 2
3 4
3
1 2 3

此时couple里面是 couple[1]=2; couple[2]=1;
输入嘉宾,3位,ID分别为1,2,3。
第一个嘉宾guest[1]=1; 然后他的ID对应的couple存在->couple[guest[1]]=couple[1]=2; 所以执行if语句。 那么我们将list[2]=1; //这句话代表对于ID为2的那个人已经有了配偶。
同理执行guest[2]=1;到最后为list[1]=1; 说明对于ID为1的那个人也有配偶。
第三个嘉宾,guest[3]=3. 首先couple[3]=4,存在,list[4]=1;这就说明,对于ID为4的人,你的配偶在会场中。但是并不代表,ID为3的人,你的配偶ID为4的人在会场。这是一个充分条件,不是必要条件。如果你要ID为3的人在会场,那么必须先找到她的配偶4才能成立。
然后对这三位嘉宾遍历。
首先list[第一位嘉宾的ID] ->list[guest[1]]=list[1]=2. 这个数为真,所以不执行下面的程序
那么重点关注在第三个嘉宾,list[guest[3]]=list[3]=0. 为假,说明在list中没有他的配偶。所以标记为单身狗。

PPS:这道题还有的坑在于记得用%05d输出。它要输出的是ID,前面带0的那种。

#include<stdio.h>

int max(int a[], int len)
{
    int i;
    int maxid = 0;
    for ( i=1; i<len; i++)
    {
        if ( a[i] > a[maxid]){
            maxid = i;
        }
    }
    return maxid;
}
main()
{
    int couple[100001]={-1};
    int guest[100005]={0};
    int dogs[100005]={0};
    int list[100005]={0};
    int n,i,m,temp1,temp3;
    int man,woman;
    scanf("%d",&n);
    i = 0;
    for(i=1;i<=n;i++){
        scanf("%d%d",&man,&woman);
        couple[woman]=man;
        couple[man]=woman;
    }

    i = 0;
    scanf("%d",&m);
    for(i=1;i<=m;i++){
        scanf("%d",&guest[i]);
        if(couple[guest[i]]!=-1){
            list[couple[guest[i]]]=1;
        }
        }
    temp3=0;
    for(i=1;i<=m;i++){
        if(!list[guest[i]]){
            temp3++;
            dogs[temp3]=guest[i];
        }
        }



    int t;
    for ( i=temp3; i>0 ; i--)
    {
        int maxid = max(dogs,i+1);
        //swap a[maxid], a[len-1]
        int t = dogs[maxid];
        dogs[maxid] = dogs[i];
        dogs[i] =t;
    } 
    if (temp3!=0){
        printf("%d\n",temp3);
    for(i=1;i<temp3;i++){
        printf("%05d ",dogs[i]);
    }
    printf("%05d",dogs[temp3]);
    } else{
        printf("%d\n",temp3);
    }
    return 0;

}

这段代码并不是我独立想出来的,参考了网上的内容。我自己想的代码超时了,但是还是可以给大家分享一下。
思路就是所有的配偶我全部都放在一起。所有的嘉宾我也都放在一起。
然后循环套循环,在嘉宾之中找到有配偶的,如果存在,那么继续在嘉宾之中找到另外一个配偶,找到了则加一个记录,没找到则不作记录,最后在大循环出来的时候如果存在标记则不把这个数当做单身狗。反之则为单身狗。
那么对于分辨配偶只需要判断,如果我第一个找到的存在配偶表中的嘉宾他在配偶表中的位置是奇数,还是偶数。如果是奇数那么剩下的那个值肯定是+1. 如果是偶数那么就-1.
这样的做法。对于测试点 4 和5是超时的… 亲测…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值