专栏文章
2024CSP-J总结
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mir4sol0
- 此快照首次捕获于
- 2025/12/04 15:45 3 个月前
- 此快照最后确认于
- 2025/12/04 15:45 3 个月前
T1 P11227 [CSP-J 2024] 扑克牌
题意概述:
每张牌具有两个属性:花色和点数。花色共有 4 种:方片、草花、红桃和黑桃。点数共有 13 种,从小到大分别为 A23456789TJQK。(注意:点数 10 在本题中记为 T)一共有 52 张扑克牌。 现在你有 n 张扑克牌,问你还有多少张没有拿到?
法一
数组模拟,定义一个二维标记数组,a[i][j]表示第i种花色的第j个点色是否存在。
CPP#include <bits/stdc++.h>
using namespace std;
int n, cnt;
bool f[5][20];
int chartoint(char x)
{
if('2' <= x && x <= '9') return x - '0';
if(x == 'A') return 1;
if(x == 'T') return 10;
if(x == 'J') return 11;
if(x == 'Q') return 12;
if(x == 'K') return 13;
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
string s;
cin >> s;
if(s[0] == 'D') f[1][zhn(s[1])] = 1;
else if(s[0] == 'C') f[2][chartoint(s[1])] = 1;
else if(s[0] == 'H') f[3][chartoint(s[1])] = 1;
else if(s[0] == 'S') f[4][chartoint(s[1])] = 1;
}
for(int i=1;i<=4;i++)
{
for(int j=1;j<=13;j++)
{
if(!f[i][j])cnt++;
}
}
cout << cnt;
return 0;
}
法二
STL——map,定义一个string和int类型的map,统计每张牌是否出现过。
CPP#include<bits/stdc++.h>
using namespace std;
string s;
map<string,int>m;
int n;
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;++i)
{
cin >> s;
m[s]++;
}
int cnt=0;
for(map<string,int>::iterator it=m.begin();it!=m.end();++it)
{
if(it->second>0)cnt++;
}
cout << 52-cnt;
return 0;
}
法三
STL——set,使用set进行去重
CPP#include <bits/stdc++.h>
using namespace std;
set<string>s;
int main()
{
int n;
cin >> n;
for (int i=1;i<=n;i++)
{
string st;
cin >> st;
s.insert(st);
}
cout << 52-s.size() << endl;
return 0;
}
总结:
考场上我是只记得map怎么用了,其实用set是最简单的。。。
T2 P11228 [CSP-J 2024] 地图探险
题意概述:
机器人从初始位置x,y出发,朝向为d,遇到墙就向右转,否则就直行。问走了k步后,机器人走了多少格
思路:
这还需要思路吗?模拟题,按题意模拟即可
CPP#include<bits/stdc++.h>
using namespace std;
int t;
char a[1005][1005];
int main()
{
cin >> t;
while(t--)
{
int n,m,k,x,y,d;
cin >> n >> m >> k;
cin >> x >> y >> d;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin >> a[i][j];
}
}
a[x][y]='1';
int cnt=0;
for(int i=1;i<=k;++i)
{
int u,v;
if(d==0)u=x,v=y+1;
if(d==1)u=x+1,v=y;
if(d==2)u=x,v=y-1;
if(d==3)u=x-1,v=y;
if(u>=1&&u<=n&&v>=1&&v<=m&&a[u][v]!='x')
{
x=u,y=v;
a[u][v]='1';
}
else
{
d=(d+1)%4;
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(a[i][j]=='1')cnt++;
}
}
cout << cnt << "\n";
}
return 0;
}
T3 P11229 [CSP-J 2024] 小木棍
题意概述:
给你一个自然数 N,使这 N 根木棍能摆出最小得数(不含前导 0)
思路:
第三题吗,先不要想着去拿满分,于是我们就看到了特殊数据。
n%7==0,这种情况下,运用贪心思想,可以得出我们自然是全部拼8最优
n%7==1,这种情况下,拼一个1,一个0,剩剩下的全拼8最合适
这样你就得到了60pts
CPPn%7==0,这种情况下,运用贪心思想,可以得出我们自然是全部拼8最优
n%7==1,这种情况下,拼一个1,一个0,剩剩下的全拼8最合适
这样你就得到了60pts
#include<bits/stdc++.h>
using namespace std;
int t;
int main()
{
cin >> t;
while(t--)
{
int n;
cin >> n;
if(n%7==0)
{
for(int i=1;i<=n/7;++i)
{
cout << 8;
}
cout << "\n";
}
else if((n-1)%7==0)
{
cout << 10;
for(int i=1;i<(n-1)/7;++i)
{
cout << 8;
}
cout << "\n";
}
}
return 0;
}
题·找规律·解
这是我后来去翻题解翻到的,原文
如果不是看到了这篇题解,我是死活也想不到可以对n/7的余数进行分类讨论的(我是真的不擅长找规律)
其实特殊数据的提示已经很明显了,都和n/7的余数有关,一个是/7余1,另一个是/7余0。并且如果你写了一个暴力将所有答案求出来以后,你就很容易找到规律
不得不说,下面这段话还是很有道理的:
暴力出奇迹,骗分过样例。
数学先打表,DP找规律。
图论背模板,数论背公式。
背包背方程,高精背代码。
如果都没背,干脆输样例。
数学先打表,DP找规律。
图论背模板,数论背公式。
背包背方程,高精背代码。
如果都没背,干脆输样例。
T4 P11230 [CSP-J 2024] 接龙
没看懂……
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...