首页 PAT-Boys vs Girls & Shuffling Machine & Look-and-say Sequence
文章
取消

PAT-Boys vs Girls & Shuffling Machine & Look-and-say Sequence

1036.Boys vs Girls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<iostream>
#include<algorithm>
using namespace std;
struct stu
{
    string name;
    char gender;
    string ID;
    int grade;
};
bool compM(stu s1, stu s2)
{
    return s1.grade < s2.grade;
}
bool compF(stu s1, stu s2)
{
    return s1.grade > s2.grade;
}
int main()
{
    int N;
    cin>>N;
    stu f[N];//女学生
    stu m[N];//男学生
    int mNum = 0, fNum = 0;//分别代表男女生数量
    //数据输入
    while(N--)
    {
        string _name, _ID;
        char _gender;
        int _score;
        cin>>_name>>_gender>>_ID>>_score;
        if(_gender == 'M')//男学生
        {
            m[mNum].name = _name;
            m[mNum].ID = _ID;
            m[mNum].grade = _score;
            mNum++;
        }
        else//女学生
        {
            f[fNum].name = _name;
            f[fNum].ID = _ID;
            f[fNum].grade = _score;
            fNum++;
        }
    }
    //排序
    if(fNum > 0)
    {
        sort(f, f + fNum, compF);
        cout<<f[0].name<<' '<<f[0].ID<<endl;
    }
    else cout<<"Absent"<<endl;
    if(mNum > 0)
    {
        sort(m, m + mNum, compM);
        cout<<m[0].name<<' '<<m[0].ID<<endl;
    }
    else cout<<"Absent"<<endl;
    if(mNum == 0 || fNum == 0)
    {
        cout<<"NA";
    }else cout<<f[0].grade - m[0].grade;


}

    PAT的题目跟力扣一个很大的不同就是需要自己写输入,而且一旦自己写输入就意味着代码量比力扣的多很多,这道题目并不难,就是变量太多了,测试的时候有很多编译错误就是变量打错了……

1042. Shuffling Machine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
    int N;//洗牌次数
    vector<int> pos(55);//洗牌位置
    vector<string> cards;//牌,不要声明数组大小!不然用不了emplace_back
    vector<string> tmp(55);//临时数组
    //数据输入,牌先初始化(题目竟然不给初始化,岂可修!)
    cards.emplace_back("Null");//先把0位置占掉
    for(int i = 0; i < 4; i++)
    {
        string s1;
        switch(i)
        {
            case 0 : s1 = "S";break;
            case 1 : s1 = "H";break;
            case 2 : s1 = "C";break;
            case 3 : s1 = "D";break;
        }
        for(int j = 1; j <= 13; j++)
        {
            cards.emplace_back(s1 + to_string(j));
        }
    }
    cards.emplace_back("J1");
    cards.emplace_back("J2");
    cin>>N;
    for(int i = 1; i <= 54; i++)cin>>pos[i];
    //开始洗牌
    while(N--)
    {
        //先把牌放到临时数组中
        for(int i = 1; i <= 54; i++)
        {
            //把当前i位置的牌放到pos[i]的位置
            tmp[pos[i]] = cards[i];
        }
        //再把临时数组的牌换成cards
        for(int i = 1; i <= 54; i++)
        {
            cards[i] = tmp[i];
        }
    }
    for(int i = 1; i <= 54; i++)
    {
        cout<<cards[i];
        if(i != 54) cout <<' ';
    }
}

    emmm,这道题最需要注意的地方是,如果初始化给vector了固定空间,那么就不能用emplace_back()函数了!!我这里没有把牌做到0~53的映射,直接用string存了,写了50行代码,我看有个博主写的映射,写了30行代码,但我觉得我这个也挺好读的哈哈哈。

1140. Look-and-say Sequence

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int D, N;
    cin>>D>>N;
    string d = to_string(D);
    N -= 1;//第N项,其实是算了N - 1次    
    while(N--)
    {
        //左右双指针
        int l = 0, r = 1;
        string tmp;//临时string,用来存n + 1项
        for(; r < d.size(); r++)//遍历右指针
        {
            if(d[r] != d[l])//如果右指针和左指针指的数不一样了
            {
                tmp += d[l] + to_string(r - l);//左指针所指数字+次数
                l = r;
            }
        }
        //把最后的数字也加入tmp,无论最后是都相等还是最后一个不相等了,都适用
        tmp += d[l] + to_string(r - l);
        d = tmp;//更新d
    }
    cout<<d;

}

    首先,这道题要先弄清楚题意,不是统计上一个字符串中每种数字一共有几个,而是连续的有几个,一旦不连续了就要重新算的。比如111222333111222就是:1323331323(3个1,3个2,3个3,3个1,3个2)而不是162633.

    第二,想用memset就要包含<cstdio><cstring>这两个头文件才行

小结

    今天开始刷pat,比想象中的更费时间,主要还是得熟悉熟悉这个答题的格式,毕竟跟leetCode还是有点区别。每天尽量三道题吧,这样一个暑假应该是能把所有类型刷一遍。

本文由作者按照 CC BY 4.0 进行授权