专栏文章

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
CPP
#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找规律。
图论背模板,数论背公式。
背包背方程,高精背代码。
如果都没背,干脆输样例。

T4 P11230 [CSP-J 2024] 接龙

没看懂……
em……其实我压根没看几眼

评论

0 条评论,欢迎与作者交流。

正在加载评论...