2024 CSP-J游记

meimu75

2024-11-03 09:51:54

Life & Travel

前言

这是第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}