T1 扑克牌
本题要求:在给定的扑克牌的基础上,还需要多少张牌可以让扑克牌凑成一整套,试题中读入的字符串每个都代表一张合法的扑克牌。
可以使用 C++ STL 中的 set(集合)完成本题。这是因为,set 可以自动去重,去除重复的牌(字符串)后,剩下的字符串就是实际拥有的不同的牌。而一副扑克牌有 52 张牌,使用 52 减去该集合的大小即可求出答案。 set <string> S; S.insert(s);
T2 地图探险
题意:题目链接。dfs模拟设置新的坐标xx,yy在不同的d下更新不同的xx,yy分别为
if(d==0) xx=x,yy=y+1;
if(d==1)xx=x+1,yy=y;
if(d==2)xx=x,yy=y-1;
if(d==3)xx=x-1,yy=y;
判断此时的xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]=='.' 是继续搜索dfs(xx,yy,d,t+1);
否则 dfs(x,y,(d+1)%4,t+1); 换方向 t为执行的次数开头要确保t<=k次 t>k 就return;
同时此时标记走过的路程vis[x][y]=1;
最后遍历vis[x][y]标记为1的个数ans++ 最后输出ans
注意!!!:多测清空!!!
T3 小木棍
题意
此题先看到数据范围:
题目给了明显的提醒n是7的倍数或n=7*k+1;
此时想到是一个规律题
0 1 2 3 4 5 6 7 8 9
6,2,5,5,4,5,6,3,7,6;
对应
现在前四十里面打表
不难发现有很多8并且是产生火柴最多的数字根据特殊性质发现规律 找出7的倍数和7的倍数+1的n
发现n%7余数为0时 全输出8 个数为n/7个。
余1时解释:n%7余数为1时 先输出10 剩下全输出8 个数为(n-8)/7个。 为了凑出7的倍数并且满足多加一个只能是7+1为8所以找数字中最小组成8个火柴的组合为10
其余同理
m | ans |
---|---|
1 | 10 后面 (n−8)/7个8 |
2 | 1 后面 (n−2)/7个8 |
3 | 200 后面 (n−17)/7个8 |
4 | 20 后面 (n−11)/7个8 |
5 | 2 后面 (n−5)/7个8 |
6 | 6 后面 (n−6)/7个8 |
T4 接龙
题意:题目链接
简化题意:我们要找是否存在 r 个头尾相接、长度为 2∼k 的序列(第一个序列一定以1开头)。
发现是序列类的问题,首先考虑 dp。题目有三个关键条件:轮数、结尾数字、上一轮选择的行。
发现q<=1e5所以不能用q循环查询要O(1)查询
定义状态g[i][j][t]表示在第i轮中,能否以第j个数字序列的第t个位置作为终点。
若 S[j][t]=1,则f[1][j][t]=true,否则f[1][j][t]=false。
我们维护两个辅助数组(作为桶数组):
- visd[j][x]表示在当前轮中,第1到j个数字序列是否能够到达值等于x的数字那么visd[j][S[j][t]]=visd[j−1][Sj][t]||g[i][j][t]。
- visu[j][x]表示在当前轮中,第j到n个数字序列是否能够到达值等于x的数字,那么visu[j][S[j][t]]=visd[j+1][S[j][t]||g[i][j][t]。
维护好辅助数组visd和visu 后我们就可以实现f[i]到下一轮的转移
转移方程:f[i+1][j][t]=visd[j−1][S[j][t]]||visu[j+1][S[j][t]]
设ans数组存g数组
最后输出ans中r,c对应的值即可
注意:多测清空,需要初始化,
标签:数字,扑克牌,题解,yy,xx,visd,J2024,CSP,题意 From: https://blog.csdn.net/2403_87651351/article/details/143527177