(洛谷)题目题号P2550 [AHOI2001] 彩票摇奖

Hello大家好我是小亦,今天也是更新题解的第一篇,最近有点忙,一直没能更新题解,那么今天呢为了补偿大家我们来看一个最逆天的题目,这道题呢是来自AHOI 2001年安徽省选的题目,你敢相信吗,这还是国内吗哪有这么水的,当时我看的时候都惊呆了,一道省选竟然是洛谷的最垃圾水平-入门,但是正确率比较低没有超过我的预期

这么简单的题目竟然正确率那么低,作者几分钟就做出来了qwq,好那么好,今天我就来讲一下这道题的思路:

其实这道题目只要求我们判断一组彩票中每张彩票的中奖情况,并统计各个奖项的中奖张数,所以肥肠的简单,那解决这个问题的关键在于(步骤分析如下qwq):

  1. 理解中奖规则:首先要清楚地理解每个奖项对应的中奖条件,即彩票上的号码与中奖号码的匹配程度。

  2. 读取和存储数据:读取输入数据,包括彩票数量、中奖号码和每张彩票上的号码。

  3. 比较彩票号码和中奖号码:对于每张彩票,需要比较其号码与中奖号码之间的匹配程度。

  4. 确定中奖等级:根据比较结果,确定每张彩票的中奖等级。

  5. 统计中奖张数:对于每个奖项,统计中奖的彩票张数。

具体步骤如下:

步骤1:读取输入

  • 读取彩票数量 nn。
  • 读取包含7个中奖号码的数组。

步骤2:初始化计数器

  • 创建一个大小为7的数组 counts,用于存储从特等奖到六等奖的中奖张数,初始值都为0。

步骤3:读取彩票并比较

  • 对于每张彩票,读取7个号码。
  • 将彩票号码与中奖号码进行比较,计算匹配的号码数量。

步骤4:确定奖项

  • 根据匹配的号码数量,确定彩票的中奖等级:
    • 特等奖:7个号码都匹配。
    • 一等奖:6个号码匹配。
    • 二等奖:5个号码匹配。
    • 三等奖:4个号码匹配。
    • 四等奖:3个号码匹配。
    • 五等奖:2个号码匹配。
    • 六等奖:1个号码匹配。

步骤5:计数并输出结果

  • 对于每个奖项,统计中奖的彩票张数。
  • 输出每个奖项的中奖张数。

实现细节

  • 排序:为了快速比较,可以将彩票号码和中奖号码排序,然后使用双指针或哈希表等方法进行比较。
  • 使用集合:将中奖号码存储在集合中,以便快速检查彩票上的号码是否在中奖号码中。

代码实现

  • 使用C++语言实现上述逻辑。
  • 使用vectorset等数据结构来存储和比较数据。
  • 使用循环和条件语句来实现比较和计数逻辑。

通过以上步骤,我们可以有效地判断每张彩票的中奖情况,并统计各个奖项的中奖张数,好思路给完了,相信大家都应该能理解了对吧,好那么好代码供上,小亦再次再次再次提醒大家,抄代码可耻!

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> winningNumbers(7);
    for (int i = 0; i < 7; ++i) {
        cin >> winningNumbers[i];
    }
    
    vector<int> counts(7, 0);
    vector<int> ticket(7);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < 7; ++j) {
            cin >> ticket[j];
        }
        
        sort(ticket.begin(), ticket.end());
        sort(winningNumbers.begin(), winningNumbers.end());
        
        int matchCount = 0;
        set<int> winningSet(winningNumbers.begin(), winningNumbers.end());
        for (int num : ticket) {
            if (winningSet.count(num)) {
                ++matchCount;
            }
        }
        
        if (matchCount == 7) counts[0]++;
        else if (matchCount == 6) counts[1]++;
        else if (matchCount == 5) counts[2]++;
        else if (matchCount == 4) counts[3]++;
        else if (matchCount == 3) counts[4]++;
        else if (matchCount == 2) counts[5]++;
        else if (matchCount == 1) counts[6]++;
    }
    
    for (int i = 0; i < 7; ++i) {
        cout << counts[i] << (i < 6 ? " " : "\n");
    }
    
    return 0;
}

放心食用~

AHOI2001是一种用于处理模式匹配和字符串搜索的经典算法,全称为"Another Happy Odyssey in 2001"。它通常应用于构建高效、空间优化的KMP(Knuth-Morris-Pratt)算法的一种改进版本。这种有限自动机常用于处理字符串搜索问题,尤其是在处理大量文本数据时。 关于题目代码的具体内容,这通常涉及到编程竞赛或算法实现题。通常,你需要编写一段程序,包括定义一个有限状态机(Finite Automaton),处理输入字符串和模式串,并根据AHOI2001算法来查找模式是否在原字符串中。关键部分会涉及如何创建前缀函数表、动态规划和自适应策略。 由于这不是一个直接的答案,下面是一个简化版的代码框架示例(假设用Python): ```python class AhoCorasickAutomaton: def __init__(self, patterns): self.prefix_func = self.build_prefix_function(patterns) def build_prefix_function(self, patterns): # 建立前缀函数表的计算过程... pass def search(self, text): index = 0 for pattern in patterns: while index < len(text) and index + len(pattern) <= len(text): if self.match(text[index:], pattern): return True index += self.prefix_func[pattern] return False def match(self, text, pattern): # 匹配函数,比较两个字符串是否相等... pass # 使用示例: patterns = ['AB', 'AC'] # 输入模式列表 automaton = AhoCorasickAutomaton(patterns) text = 'ABCABCD' # 待搜索的字符串 if automaton.search(text): print("Pattern found") else: print("Pattern not found")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值