2 条题解
-
0
#include<iostream> using namespace std; int a[105]; char b[105]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++)scanf("%d%s",&a[i],&b[i]); int c[n+1]={0}; for(int i=1;i<=m;i++){ if(b[i]=='M'){ if(c[a[i]]==0){ c[a[i]]=1; printf("Yes\n"); }else{ printf("No\n"); } }else{ printf("No\n"); } } return 0; } -
0
📝 题目大意
给定 户人家和按出生顺序排列的 个孩子(每家一个编号 和性别 ),判断每个孩子是否是该户人家中第一个出生的男孩,是则输出
Yes,否则输出No。💡 解题思路
-
题目分析:核心问题是判断每个男孩是否是其家庭中首次出现的男孩。女孩永远不可能是"太郎",直接输出
No。数据范围 较小,但即使更大也只需 即可解决。 -
算法推导:
- 用一个布尔数组
v[x]记录第 户人家是否已经出现过男孩,初始全为false。 - 按出生顺序遍历每个孩子:
- 若性别为
'F'(女孩),直接输出No,不更新标记。 - 若性别为
'M'(男孩):- 若
v[x] == false,说明这是该户人家的第一个男孩,输出Yes,并将v[x]置为true。 - 若
v[x] == true,说明该户人家已有男孩出现过,输出No。
- 若
- 若性别为
- 该贪心策略的正确性在于:题目严格按出生顺序给出孩子,第一个遇到的男孩自然就是该户人家出生最早的男孩,后续再遇到的男孩都不可能是"太郎"。
- 用一个布尔数组
-
边界与细节:
- 一户人家可能一个男孩都没有,对应的
v[x]始终为false,不影响输出。 - 一户人家可能全是女孩,所有输出均为
No。 - 注意输入字符
c可能被换行符干扰,使用cin >> c即可自动跳过空白字符。 - 数组大小开
n+5防止越界,因为家庭编号从 到 。
- 一户人家可能一个男孩都没有,对应的
⏱️ 复杂度分析
- 时间复杂度:,只需遍历 个孩子一次,每次 判断。
- 空间复杂度:,需要一个大小为 的布尔数组
v记录每家是否已出现男孩。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int n, m; cin >> n >> m; bool v[n + 5]; // v[x] 表示第 x 户人家是否已经出现过男孩 memset(v, 0, sizeof v); // 初始化为 false,所有家庭都还没有男孩 for (int i = 1, x; i <= m; i++) { char c; cin >> x >> c; // x: 家庭编号, c: 性别 ('M'/'F') if (c == 'M') // 当前孩子是男孩 { if (v[x] == 0) // 第一个男孩 → 太郎 cout << "Yes\n"; else // 不是第一个男孩 cout << "No\n"; v[x] = 1; // 标记该户人家已出现男孩 } else // 女孩不可能是太郎 cout << "No\n"; } return 0; } -
- 1
信息
- ID
- 827
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 5
- 已通过
- 4
- 上传者