1. 程式人生 > >PTA帥到沒朋友,天梯模擬賽

PTA帥到沒朋友,天梯模擬賽

11 帥到沒朋友   (20分)

當芸芸眾生忙著在朋友圈中發照片的時候,總有一些人因為太帥而沒有朋友。本題就要求你找出那些帥到沒有朋友的人。

輸入格式:

輸入第一行給出一個正整數N\le 100100),是已知朋友圈的個數;隨後N行,每行首先給出一個正整數K\le 10001000),為朋友圈中的人數,然後列出一個朋友圈內的所有人——為方便起見,每人對應一個ID號,為5位數字(從00000到99999),ID間以空格分隔;之後給出一個正整數M\le 1000010000),為待查詢的人數;隨後一行中列出M個待查詢的ID,以空格分隔。

注意:沒有朋友的人可以是根本沒安裝“朋友圈”,也可以是隻有自己一個人在朋友圈的人。雖然有個別自戀狂會自己把自己反覆加進朋友圈,但題目保證所有K

超過1的朋友圈裡都至少有2個不同的人。

輸出格式:

按輸入的順序輸出那些帥到沒朋友的人。ID間用1個空格分隔,行的首尾不得有多餘空格。如果沒有人太帥,則輸出No one is handsome

注意:同一個人可以被查詢多次,但只輸出一次。

輸入樣例1:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888

輸出樣例1:

10000 88888 23333

輸入樣例2:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111

輸出樣例2:

No one is handsome

方法一:

是通過類似桶排序的方法,把大於一人的朋友圈的所有人的編號用作下標存下來。

#include<stdio.h>
#include <string.h>
int f[199999];
int main()
{
    int n, m, i, j = 0, x, y;
    scanf("%d", &n);
    memset(f, 0, sizeof(f));//初始0/
    while(n--)
    {
        scanf("%d", &m);
        if(m > 1)//判斷朋友圈人數是否大於一,大於一存起來/
        {
            for(i = 0;i < m;i++)
            {
                scanf("%d", &x);
                f[x]++;
            }
        }
        else
            scanf("%d", &x);
    }
    scanf("%d", &m);
    while(m--)
    {
        scanf("%d", &y);
        if(!f[y])
        {
            if(!j)
            {
                printf("%05d", y);//注意根據題意必須是5位/
                f[y]++;
                j++;
            }
            else
            {
                printf(" %05d", y);
                f[y]++;
            }
        }
    }
    if(!j)
        printf("No one is handsome");
    printf("\n");
    return 0;
}

方法二:

這是我比賽的程式碼,當時資料沒有全過,後來改了一下,我也沒有注意到必需是5位。這個方法的話,主要是用二維陣列進行儲存,每行的第一項要存這一行的項數。

#include <stdio.h>
int f[111][1111];
int main()
{
    int n, m, i, j, k, x, sum[111], y = 0;
    scanf("%d", &n);
    for(i = 0;i < n;i++)
    {
        scanf("%d", &m);
        f[i][0] = m;
        for(j = 1;j <= m;j++)
        {
            scanf("%d", &f[i][j]);
        }
    }
    scanf("%d", &k);
    while(k--)
    {
        scanf("%d", &x);
        int flag = 1;
        for(i = 0;i < n;i++)
        {
            m = f[i][0];
            for(j = 1;j <= m;j++)
            {
                if(x == f[i][j]&&m > 1)
                {
                    flag = 0;
                    break;
                }
            }
        }
        if(flag)
        {
            int c = 1;
            for(i = 0;i < y;i++)
            {
                if(x == sum[i])
                {
                    c = 0;
                    break;
                }
            }
            if(c)
                sum[y++] = x;
        }
    }
    if(y)
    {
        for(i = 0;i < y;i++)
        {
            if(i == y - 1)
                printf("%05d\n", sum[i]);
            else
                printf("%05d ", sum[i]);
        }
    }
    else
        printf("No one is handsome\n");
    return 0;
}