2024CSP-J总结

· · 个人记录

T1 P11227 [CSP-J 2024] 扑克牌

题意概述:

每张牌具有两个属性:花色和点数。花色共有 4 种:方片、草花、红桃和黑桃。点数共有 13 种,从小到大分别为 A23456789TJQK。(注意:点数 10 在本题中记为 T)一共有 52 张扑克牌。 现在你有 n 张扑克牌,问你还有多少张没有拿到?

法一

数组模拟,定义一个二维标记数组,a[i][j]表示第i种花色的第j个点色是否存在。

#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,统计每张牌是否出现过。

#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进行去重

#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步后,机器人走了多少格

思路:

这还需要思路吗?模拟题,按题意模拟即可

#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

#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……其实我压根没看几眼