OneCoder Avatar
OneCodercoderli.com · 937 篇博文
四级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【GESP】C++四级练习 luogu-P2550 [AHOI2001] 彩票摇奖

📅 2025-06-16·✍️ OneCoder·计算中...·⏱️ 7 分钟
#GESP#C++#多维数组

GESP C++四级练习,二维/多维数组练习,难度★★☆☆☆。

luogu-P2550 [AHOI2001] 彩票摇奖

题目要求

题目描述

为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:

  1. 每张彩票上印有 77 个各不相同的号码,且这些号码的取值范围为 1331\sim33
  2. 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
  3. 共设置 77 个奖项,特等奖和一等奖至六等奖。

兑奖规则如下:

  • 特等奖:要求彩票上 77 个号码都出现在中奖号码中。
  • 一等奖:要求彩票上有 66 个号码出现在中奖号码中。
  • 二等奖:要求彩票上有 55 个号码出现在中奖号码中。
  • 三等奖:要求彩票上有 44 个号码出现在中奖号码中。
  • 四等奖:要求彩票上有 33 个号码出现在中奖号码中。
  • 五等奖:要求彩票上有 22 个号码出现在中奖号码中。
  • 六等奖:要求彩票上有 11 个号码出现在中奖号码中。

注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。例如,中奖号码为 23 31 1 14 19 17 1823\ 31\ 1\ 14\ 19\ 17\ 18,则彩票 12 8 9 23 1 16 712\ 8\ 9\ 23\ 1\ 16\ 7 由于其中有两个号码(232311)出现在中奖号码中,所以该彩票中了五等奖。

现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。

输入格式

输入的第一行只有一个自然数 nn,表示小明买的彩票张数;

第二行存放了 77 个介于 113333 之间的自然数,表示中奖号码;

在随后的 nn 行中每行都有 77 个介于 113333 之间的自然数,分别表示小明所买的 nn 张彩票。

输出格式

依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。

输入输出样例 #1

输入 #1

PLAINTEXT
2
23 31 1 14 19 17 18
12 8 9 23 1 16 7
11 7 10 21 2 9 31

输出 #1

PLAINTEXT
0 0 0 0 0 1 1

数据规模与约定

对于 100%100\% 的数据,保证 1n<10001 \leq n\lt1000


题目分析

解题思路

本题的解题思路如下:

  1. 问题本质:

    • 输入 nn 张彩票,每张彩票有 77 个不同号码
    • 给定一组中奖号码(77 个不同数字)
    • 统计每个奖项的中奖数量
  2. 解题思路:

    • 问题建模
      • 每张彩票与中奖号码的匹配数决定中奖等级
      • 匹配 kk 个号码对应 (7k)(7-k) 等奖
      • 需要统计 nn 张彩票各自的匹配数
    • 数据结构设计
      • 使用一维数组存储中奖号码 target[7]
      • 使用二维数组存储购买的彩票号码 buy_ary[1005][7]
      • 使用一维数组存储各奖项中奖数量 result[7]
    • 处理流程
      1. 读取输入:
        • 读取彩票数量 nn
        • 读取中奖号码
        • 读取每张彩票的号码
      2. 匹配统计:
        • 遍历每张彩票的每个号码
        • 与中奖号码比较,统计匹配数
        • 根据匹配数更新对应奖项计数
      3. 结果输出:
        • 按特等奖到六等奖顺序输出
    • 注意事项
      • 号码范围为 1331 \sim 33
      • 每组号码都是不重复的
      • 号码顺序不影响匹配结果
  3. 复杂度分析:

    • 时间复杂度:O(n×7×7)O(n \times 7 \times 7),其中 nn 为彩票数量
    • 空间复杂度:O(n×7)O(n \times 7),主要是存储彩票号码的二维数组

示例代码

CPP
#include <iostream>

// 存储所有购买的彩票号码的二维数组
int buy_ary[1005][7];
int main() {
    // n表示购买的彩票数量
    int n;
    std::cin >> n;

    // 存储中奖号码的数组
    int target[7] = {0};
    // 读入7个中奖号码
    for (int i = 0; i < 7; i++) {
        std::cin >> target[i];
    }

    // 存储各个奖项的中奖数量,从特等奖到六等奖
    int result[7] = {0};

    // 遍历每一张购买的彩票
    for (int i = 0; i < n; i++) {
        // count记录当前彩票匹配中奖号码的个数
        int count = 0;
        // 比较每一张彩票
        for (int j = 0; j < 7; j++) {
            // 读入当前彩票的号码
            std::cin >> buy_ary[i][j];
            // 将当前号码与所有中奖号码比较
            for (int k = 0; k < 7; k++) {
                if (buy_ary[i][j] == target[k]) {
                    count++;
                }
            }
        }
        // 如果有匹配的号码,更新对应奖项的中奖数量
        // 7-count的含义:7个匹配是特等奖(index 0),6个匹配是一等奖(index 1),以此类推
        if (count) {
            result[7 - count]++;
        }
    }

    // 按顺序输出各个奖项的中奖数量
    for (int i = 0; i < 7; i++) {
        std::cout << result[i] << " ";
    }
    return 0;
}

💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!