7-3 单身狗(C语言)

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

输入格式:

输入第一行给出一个正整数 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

代码长度限制

16 KB

时间限制

200 ms

内存限制

64 MB

 

  当我看到这个时间限制的时候,我毅然决然放弃了使用java写程序的想法,转身投入C语言的怀抱! 

先贴上代码:

#include <stdio.h>
#define Max 100000
int N , M;

void BuildHeap(int A[],int i,int Number)	//构造堆
{
    int c,temp;
    for (temp=A[i];2*i <= Number; i=c)	//temp记录下父母节点的值,c为一个子女节点
    {
        c=2*i;
        if(c < Number && A[c + 1] > A[c])//找到最大的子女节点
            ++c;
        if(temp<A[c])		//父母节点值等于子女节点中大的
            A[i]=A[c];
        else
            break;
    }
    A[i]=temp;//对被交换的子女节点赋值 比如在2 9 8 6 5 7中9和2交换后,2需要和6再进行交换,最后只需要对6最开始的位置赋值2就行
}
void Heapsort(int a[])	//排序
{
    int i,temp;
    for(i=M/2;i>=1;i--)	//从最后一个父母节点开始,知道根节点
    {
        BuildHeap(a,i,M);
    }
    for(i=M;i>0;i--)	//删除根节点后,重新构造堆
    {
        temp=a[1];
        a[1]=a[i];
        a[i]=temp;
        BuildHeap(a,1,i-1);
    }
}

int main() {
    int Couple[Max];
    for (int i = 0; i < Max; ++i) {
        Couple[i] = -1;
    }
    scanf("%d" , &N);
    for (int i = 0; i < N; ++i) {
        int couple1 , couple2;
        scanf("%d %d" , &couple1 , &couple2);
        Couple[couple1] = couple2;
        Couple[couple2] = couple1;
    }
    scanf("%d" , &M);
    int Participators[M + 1];
    for (int i = 1; i <= M; ++i) {
        scanf("%d" , &Participators[i]);
    }
    Heapsort(Participators);
    int num = 0;
    int dogs[M];
    for (int i = 1; i <= M; ++i) {
        dogs[i] = 0;
        int code = Participators[i];
        if(Couple[code] != -1){
            int newcode = Couple[code];
            for(int j = i + 1; j <= M ; j++){
                if(Couple[code]== Participators[j]){
                    Couple[code] = -2;
                    Couple[newcode] = -2;
                    break;
                }
            }
        }
        if(Couple[code] == -2){
            continue;
        }
            dogs[num] = Participators[i];
            num++;

    }
    printf("%d\n" , num);
    if(num == 0){
        return 0;
    }
    if(0 <= dogs[0] && dogs[0] <= 9){
        printf("0000");
        printf("%d" , dogs[0]);
    } else if(10 <= dogs[0] && dogs[0] < 100){
        printf("000");
        printf("%d" , dogs[0]);
    }else if(100 <= dogs[0] && dogs[0] < 1000){
        printf("00");
        printf("%d" , dogs[0]);
    }else if(1000 <= dogs[0] && dogs[0] < 10000){
        printf("0");
        printf("%d" , dogs[0]);
    }else printf("%d" , dogs[0]);
    for (int i = 1; i < M; ++i) {
        if(dogs[i] != 0){
            if(0 <= dogs[i] && dogs[i] <= 9){
                printf(" 0000");
                printf("%d" , dogs[i]);
            } else if(10 <= dogs[i] && dogs[i] < 100){
                printf(" 000");
                printf("%d" , dogs[i]);
            }else if(100 <= dogs[i] && dogs[i] < 1000){
                printf(" 00");
                printf("%d" , dogs[i]);
            }else if(1000 <= dogs[i] && dogs[i] < 10000){
                printf(" 0");
                printf("%d" , dogs[i]);
            }else printf(" %d" , dogs[i]);
            }
        }
}

 因为看到这个时间如此之严格的限制,我选择了堆排序,参考来源:http://t.csdnimg.cn/kcVKkicon-default.png?t=N7T8http://t.csdnimg.cn/kcVKk

然后我的思路是这样的:

最后再加上优化一下打印就行了。 

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值