1 条题解

  • 0
    @ 2026-10-18 21:32:26

    [AHOI 2001] 彩票摇奖

    知识点

    集合、标记数组、频次统计

    解题思路

    用布尔数组记录7个中奖号码。逐张彩票统计命中个数k,若k>0则累加cnt[k]。按k从7到1输出。

    正确性说明

    单张彩票号码各不相同,因此命中数就是该彩票与中奖号码集合的交集大小。交集大小唯一决定奖项,分别累加后逆序输出正好对应特等奖到六等奖。

    易错点

    号码的位置无关;0个命中不属于任何奖项;不能把号码值当作奖项编号。

    复杂度

    时间O(7n+33)=O(n),额外空间O(33)=O(1)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int n;cin>>n;bool win[34]={};int cnt[8]={};
        for(int i=0,x;i<7;++i){cin>>x;win[x]=true;}
        for(int i=0;i<n;++i){int k=0;for(int j=0,x;j<7;++j){cin>>x;k+=win[x];}if(k)++cnt[k];}
        for(int k=7;k>=1;--k)cout<<cnt[k]<<(k==1?'\n':' ');
    }
    
    • 1

    信息

    ID
    85
    时间
    1000ms
    内存
    256MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者