1 条题解

  • 0
    @ 2025-8-24 21:14:47

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 一扶苏一
    休息结束。邮箱 yifusuyi@qq.com

    搬运于2025-08-24 21:14:47,当前版本为作者最后更新于2018-11-04 15:23:55,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    [语言月赛202304E] 你的牌太多了 题解

    Source & Knowledge

    2023 年 4 月语言月赛,由洛谷网校入门计划/基础计划提供。

    本题考查一维数组的应用。

    文字题解

    题目大意

    扶苏和小 F 玩牌,初始时每人都有 nn 张牌,每次扶苏先出牌,小 F 会在自身手牌中选择花色与扶苏的牌相同且点数大于扶苏出牌的牌里点数最小的牌,然后打出。

    求最终小 F 手里剩了几张牌。

    1n1001 \leq n \leq 100

    解析

    依照题意模拟即可。

    首先使用四个数组 f1p1f2p2 来存储双方的手牌信息。为了能知道每张牌是否被打出,还需呀一个 vis 数组表示每张牌是否被使用过了。

    每次读入扶苏打出的手牌编号 xx,然后用一个变量 pospos 表示本轮小 F 打出的手牌编号。初始时 pos=0pos = 0 表示没有找到打出的牌。

    枚举一遍小 F 所有的手牌,对一个还未打出的牌,如果它的花色和扶苏的牌相同且点数比扶苏的牌大,则比较这个牌的点数和 pospos 号牌的点数,尝试更新 pospos。注意当 pospos00 时无需比较,直接更新。

    for (int x, i = 1; i <= n; ++i) {
      cin >> x; --x;
      int pos = 0;
      for (int i = 1; i <= n; ++i) if (!use[i]) {
        if (f2[i] == f1[x] && p2[i] > p1[x]) {
          if (pos == 0) pos = i;
          else if (p2[pos] > p2[i]) pos = i;
        }
      }
      if (pos != 0) use[pos] = 1;
    }
    

    最后,统计 use 数组里为 00 的数字数量,就是没有打出的牌。这一步可以使用一个循环完成:

    int ans = 0;
    for (int i = 1; i <= n; ++i) if (!use[i]) ++ans;
    cout << ans << '\n';
    

    也可以使用 algorithm 头文件中的函数 count(begin, end, val) 完成。它的作用是查询 [begin,end)[begin, end) 区间内等于 valval 的数字个数。

    cout << count(use + 1, use + 1 + n, 0);
    

    视频题解

    完整代码请在视频题解中查看

    • 1

    信息

    ID
    8607
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者