Programming Ability Test 乙级真题及训练集1065

来源:互联网 发布:每个淘宝号最多刷几单 编辑:程序博客网 时间:2024/06/04 21:32

1065. 单身狗(25)

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数;随后N行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(<=10000),为参加派对的总人数;随后一行给出这M位客人的ID,以空格分隔。题目保证无人重婚或脚踩两条船。

输出格式:

首先第一行输出落单客人的总人数;随后第二行按ID递增顺序列出落单的客人。ID间用1个空格分隔,行的首尾不得有多余空格。

输入样例:

3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333

输出样例:

5
10000 23333 44444 55555 88888

解题过程

#include <iostream>#include <stdio.h>using namespace std;int szzsz(int in,int num[],int gs);int ewszzsz(int in,int num[][2],int gs);int cmp ( const void *a , const void *b );int main(int argc, char *argv[]){    int N,yhid[50000][2],M,mgrid[10000],i,j=0,dsgid[10000],wldid[10000],ldid[10000],ngs=0,ygs=0,ldrs=0;    scanf("%d",&N);    for(i=0;i<N;i++)    {        scanf("%d %d",&yhid[i][0],&yhid[i][1]);         }    scanf("%d",&M);    for(i=0;i<M;i++)    {        scanf("%d",&mgrid[i]);          }    for(i=0;i<M;i++)    {        if(ewszzsz(mgrid[i],yhid,N)!=0)        {            if(yhid[ewszzsz(mgrid[i],yhid,N)][0]=mgrid[i])            {                if(szzsz(yhid[ewszzsz(mgrid[i],yhid,N)][1],mgrid,M)!=0)                {                    wldid[ngs++]=mgrid[i];                }                else                {                    ldid[ygs++]=mgrid[i];                }            }            else            {                if(szzsz(yhid[ewszzsz(mgrid[i],yhid,N)][0],mgrid,M)!=0)                {                    wldid[ngs++]=mgrid[i];                }                else                {                    ldid[ygs++]=mgrid[i];                }            }        }        else        {            ldid[ygs++]=mgrid[i];        }       }    printf("%d\n",ygs);    qsort(ldid,ygs,sizeof(ldid[0]),cmp);    for(i=0;i<ygs;i++)    {        printf("%d ",ldid[i]);    }    return 0;}int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } int szzsz(int in,int num[],int gs){    for(int i=0;i<gs;i++)    {        if(num[i]==in)        {             return i;        }     }     return 0;}int ewszzsz(int in,int num[][2],int gs){    for(int i=0;i<gs;i++)    {        if(num[i][0]==in||num[i][1]==in)        {            return i;        }     }     return 0;   }

这个就是我的思路,完全失败,就像老太婆的裹脚布又臭又长,下面是布道者的思路

#include <iostream>using namespace std;int cmp(const void *a,const void *b){    return *(int *)a - *(int *)b;}int main(int argc, char *argv[]){    int n,m,i=0,j,t=0;      int X,Y;        int c[100000]={0};      int d[100000]={0};      int e[100000]={0};    scanf("%d",&n);//输入夫妻对数     while(i<n)//输入各对夫妻    {        scanf("%d %d",&X,&Y);        c[X]=Y;c[Y]=X;//因为X不可能等于Y,所以可以这样赋值,并让配对好的和单身的得以区分,单身的值均为0;        i++;    }    i=0;    scanf("%d",&m);//输入参与人数    while(i<m)//输入人数编号    {        scanf("%d",&d[i]);        i++;    }    i=0;    while(i<m)    {        j=i+1;        if (c[d[i]]!=0)        {            while(j<m)            {                if(c[d[i]]==d[j])                {                    d[i]=0;                    d[j]=0;                }            j++;            }        }    i++;    }    i=0;    while(i<m)    {        if(d[i]!=0)        {            e[t]=d[i];            t++;        }    i++;    }    printf("%d\n",t);    qsort(e,t,sizeof(e[0]),cmp);    i=0;    while(i<t-1)    {        printf("%d ",e[i]);        i++;    }    printf("%d ",e[i]);    return 0;}

看上去条理清晰,逻辑上似乎也没有问题对吧,可惜还是出错了。待这题研究出来我会把最后代码放在下面的。

阅读全文
0 0
原创粉丝点击