2024 CSP-J游记
前言
这是第3次参加 CSP-J/S 了(第一次初赛没过,第二次初赛 67 复赛 115,这次初赛 97 估分 225)。
本人小学6年级。坐标 HN CS,考点是长沙理工大学金盆岭校区。
游记
前一天我妈就把我带到了旁边的酒店,去踩了个点(之前在云塘校区骑自行车方便,这次也带了,但是发现并不方便),然后当天晚上打了一个小时的MC没干啥就睡觉了。
第二天直接去了校区,找到座位开始打小恐龙看电脑。题目发下来之后就开始写代码。
-
T1 扑克牌
直接就是用
map统计不同牌的数量,然后52-mp.size()。 -
T2 地图探险
模拟,没啥。
就是先处理起点,然后执行 k 次操作,每一次计算下一个点的位置,如果合法,就前进,并且标记、统计答案,否则转向。
细节:起点算入答案,并且要标记,防止后面再走入起点是重复算入。
-
T3 小木棍
枚举数,然后计算需要木棍数,枚举到的第一个合法数就是答案,10分。(有个朋友跟我说她是无限枚举,50分,但是我这么搞20分)
-
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}