2020.10.25补题

 出生年 

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:

输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:

根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:

1988 4
 

输出样例1:

25 2013
 

输入样例2:

1 2
 

输出样例2:

0 0001

此题主要是如何判断出现数字的次数。开一个长度为10的数组,存0到9记录最后遍历。
#include<bits/stdc++.h>
using namespace std;

int main(){
    int year,num;
    cin >> year >> num;
    int year1;
    year1=year;
    int a[100];

    while(year1){
        for(int i = 0;i<10;i++)a[i]=0;
        int sum=0;
        int year2=year1;
        a[year2%10]=1;
        year2/=10;
        a[year2%10]=1;
        year2/=10;
        a[year2%10]=1;
        year2/=10;
        a[year2]=1;
        for(int i = 0;i<10;i++){
            if(a[i]==1)sum++;}
        if(sum==num)break;
        year1++;
    }
    cout<<year1-year<<" ";
    printf("%04d",year1);
}

注意:此题输入的年份不超过3000但是并未说结果不能超过3000.

7-9 小字辈 (25分)
 

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。

输入格式:

输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。

输出格式:

首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。

思路:对于一辈接一辈的关系可以用链表存储。对于这道题我的思路被困在了如何排辈分所以在网上借鉴了一下。

#include<bits/stdc++.h>

using namespace std;

const int N = 100001;

struct Node

{
    vector<int> hz;   \\根据父母找孩子

    int bf;           \\辈分

    int fm;           \\父母

}a[N];

int ans[100001]; int top = -1;

int xam = -1;

void bff(int i, int n)

{

    a[i].bf = n;

    if (n > xam)xam = n;

    for (int j = 0; j < a[i].hz.size(); j++)

    {

        bff(a[i].hz[j], n + 1);

    }

}


int main()

{

    int n, temp;

    cin >> n;

    for (int i = 1; i <= n; i++)

    {

        a[i].fm = -2;

        a[i].bf = -2;

    }

    int s;

    for (int i = 1; i <= n; i++)

    {

        scanf("%d", &temp);

        a[i].fm = temp;

        if (temp == -1) s = i;

        else

            a[temp].hz.push_back( i);

    }

    bff(s, 1);

    cout << xam << endl;

    for (int i = 1; i <= n; i++)

    {

        if (a[i].bf == xam)

        {

            ans[++top] = i;

        }

    }

    for (int i = 0; i < top; i++)

    {

        printf("%d ", ans[i]);

    }

    printf("%d", ans[top]);

    return 0;

}

 

posted @ 2020-10-25 22:43  xiaoxu778  阅读(114)  评论(0)    收藏  举报