2 条题解

  • 0
    @ 2026-6-21 20:26:22
    #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
      @ 2026-6-19 10:30:59

      📝 题目大意

      给定 NN 户人家和按出生顺序排列的 MM 个孩子(每家一个编号 AiA_i 和性别 BiB_i),判断每个孩子是否是该户人家中第一个出生的男孩,是则输出 Yes,否则输出 No

      💡 解题思路

      1. 题目分析:核心问题是判断每个男孩是否是其家庭中首次出现的男孩。女孩永远不可能是"太郎",直接输出 No。数据范围 N,M100N, M \leq 100 较小,但即使更大也只需 O(M)O(M) 即可解决。

      2. 算法推导

        • 用一个布尔数组 v[x] 记录第 xx 户人家是否已经出现过男孩,初始全为 false
        • 按出生顺序遍历每个孩子:
          • 若性别为 'F'(女孩),直接输出 No,不更新标记。
          • 若性别为 'M'(男孩):
            • v[x] == false,说明这是该户人家的第一个男孩,输出 Yes,并将 v[x] 置为 true
            • v[x] == true,说明该户人家已有男孩出现过,输出 No
        • 该贪心策略的正确性在于:题目严格按出生顺序给出孩子,第一个遇到的男孩自然就是该户人家出生最早的男孩,后续再遇到的男孩都不可能是"太郎"。
      3. 边界与细节

        • 一户人家可能一个男孩都没有,对应的 v[x] 始终为 false,不影响输出。
        • 一户人家可能全是女孩,所有输出均为 No
        • 注意输入字符 c 可能被换行符干扰,使用 cin >> c 即可自动跳过空白字符。
        • 数组大小开 n+5 防止越界,因为家庭编号从 11NN

      ⏱️ 复杂度分析

      • 时间复杂度O(M)O(M),只需遍历 MM 个孩子一次,每次 O(1)O(1) 判断。
      • 空间复杂度O(N)O(N),需要一个大小为 NN 的布尔数组 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
      上传者