2024 CSP-J游记

· · 生活·游记

前言

这是第3次参加 CSP-J/S 了(第一次初赛没过,第二次初赛 67 复赛 115,这次初赛 97 估分 225)。

本人小学6年级。坐标 HN CS,考点是长沙理工大学金盆岭校区。

游记

前一天我妈就把我带到了旁边的酒店,去踩了个点(之前在云塘校区骑自行车方便,这次也带了,但是发现并不方便),然后当天晚上打了一个小时的MC没干啥就睡觉了。

第二天直接去了校区,找到座位开始打小恐龙看电脑。题目发下来之后就开始写代码。

  1. T1 扑克牌

    直接就是用 map 统计不同牌的数量,然后 52-mp.size()。

  2. T2 地图探险

    模拟,没啥。

    就是先处理起点,然后执行 k 次操作,每一次计算下一个点的位置,如果合法,就前进,并且标记、统计答案,否则转向。

    细节:起点算入答案,并且要标记,防止后面再走入起点是重复算入。

  3. T3 小木棍

    枚举数,然后计算需要木棍数,枚举到的第一个合法数就是答案,10分。(有个朋友跟我说她是无限枚举,50分,但是我这么搞20分)

  4. T4 接龙

    纯暴力 dfs,枚举每个人的接龙序列,然后判断,15分。

    康康我的代码:

    int n,k,q,r,c;
    bool ans;
    int l[100005];
    vector<int> s[100005];
    //   dfs(当前轮数,上次末尾, 上次的人)
    void dfs(int step,int last,int lastren)
    {
        if(ans)return;//已经OK了就直接不搜了。
        if(step > r)
        {
            if(last == c)
            {
                ans = true;//结尾是c,有答案了
            }
            return;
        }
        for(int i = 1;i <= n;i++)//枚举人
        {
            if(i == lastren)continue;//不能与上一次的人重复
            for(int len = 2;len <= k;len++)//枚举当前接龙的长度
            {
                for(int lt = 1;lt+len-1 <= l[i];lt++)//枚举序列左端点
                {
                    int rt = lt+len-1;//计算序列右端点
                    if(step == 1)//第一次
                    {
                        if(s[i][lt] == 1)//必须是以1开头
                        {
                            dfs(step+1,s[i][rt],i);
                        }
                    }
                    else
                    {
                        if(s[i][lt] == last)//必须以上一次的末尾开头
                        {
                            dfs(step+1,s[i][rt],i);
                        }
                    }
                }
            }
        }
        return;
    }
    int main()
    {
        int t;
        cin >> t;
        while(t--)
        {
            cin >> n >> k >> q;
            for(int i = 1;i <= n;i++)
            {
                cin >> l[i];
                s[i].clear();
                s[i].push_back(0);
                for(int j = 1;j <= l[i];j++)
                {
                    int x;
                    cin >> x;
                    s[i].push_back(x);
                }
            }
            while(q--)
            {
                cin >> r >> c;
                ans = 0;
                dfs(1,-1,0);
                cout << ans << "\n";
            }
        }
        return 0;
    }

    By \color{#FE4C61} \textmd{meimu75}