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; }
浙公网安备 33010602011771号