PAT甲级题目翻译+答案 AcWing(字符串处理)

1001 A+B Format (20 分)

  • 题意 :将整数转换成标准格式
  • 思路 :从后往前遍历字符串进行模拟,每三个数字加一个逗号,但不能是在最前面加逗号,也不能是加在负号后面
#include <iostream>

using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;
    string num = to_string(a + b);
    string ans = "";
    for (int i = num.size() - 1, j = 0; i >= 0; i -- )
    {
        ans = num[i] + ans;
        ++ j;
        if (j % 3 == 0 && i && num[i - 1] != '-') ans = "," + ans;
    }
    
    cout << ans;
    
    return 0;
}


1005 Spell It Right (20 分)

  • 题意 :得到输入数的各位之和后按位输出分别的英文
  • 语法 :行末无空格,可以先输出第一位后,分别输出一个空格加每一位
#include <iostream>

using namespace std;

string word[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

int main()
{
    string n;
    cin >> n;
    
    int s = 0;
    for (auto c : n) s += c - '0';
    
    string str = to_string(s);
    
    cout << word[str[0] - '0'];
    for (int i = 1; i < str.size(); i ++ ) cout << ' ' << word[str[i] - '0'];
    
    return 0;
}


1006 Sign In and Sign Out (25 分)

  • 题意 :在输入的每个第二个字符串中找最小的,第三个找最大的,输出它们分别对应的第一个字符串
#include <iostream>

using namespace std;

int main()
{
    string open_id, open_time;
    string close_id, close_time;
    
    int m;
    cin >> m;
    
    for (int i = 0; i < m; i ++ )
    {
        string id, in_time, out_time;
        cin >> id >> in_time >> out_time;
        
        //  更新
        if (!i || in_time < open_time)
        {
            open_id = id;
            open_time = in_time;
        }
        
        if (!i || out_time > close_time)
        {
            close_id = id;
            close_time = out_time;
        }
    }
    
    cout << open_id << ' ' << close_id;
    
    return 0;
}

1016 Phone Bills (25 分)

题意 :

  • chronologically时间先后顺序;alphabetical order字典序
  • 给出每个时间段内每分钟的话费,给出n条消息包含用户名称,月日时分,打开还是关闭状态
  • 要求按字典序输出所有用户的账单,账单包含用户名称和发生的月份,再按时间先后顺序分别输出每一段话费的起始时间和时长和价格,最后输出总价格
  • 保证所有日期在同一个月内,且每个on对应的off是输入中的时间顺序的下一个off,无视无法配对的
  • 注意给出时间段的价格是美分,而最后输出是美元,除以100.0

思路 :

  • 将所有时间都转换成这个月的分钟数,但输出时还要输出这种格式化的时间,所以原先格式化的时间也要存下来
  • 注意到如果每条通话记录的话费按照每一分钟来算,时间复杂度非常高,500(人) * 31 * 1440 * 24,而且这道题时间限制是0.2秒。那么怎么优化呢?注意到每次是算一个区间内话费是多少,因此可以用前缀和思路优化,先预处理出1号0点0分到这个月中任何一个时刻的话费,每个月中有多少个不同是时间呢?31 * 1440,不是很大
  • 前缀和计算话费时,算的是i - 1时刻,% 1440表示在一个周期中是第几分钟,/ 60表示这是第几个小时
  • sum[i]表示 00 : 00 − 00 : 01 , 00 : 01 − 00 : 02 , . . . , − 00 : i 00:00-00:01,00:01-00:02,...,-00:i 00:0000:01,00:0100:02,...,00:i,所以利用前缀和时不用-1
  • 关于如何处理on和off关系,就是把它们全部存在一个容器中,然后按时间顺序排序,如果第一个是on且它的下一个刚好是off,就是一对合法的时间
  • 需要记录的是每个人名对应的记录结构题,记录结构题中存对应映射的时刻,状态,标准化时间

语法 :

  • 如何在字符串中格式化写入信息,用sprintf
  • map遍历天然就是字典序;且遍历时可以加&,这样就不会涉及到复制,会快一些
  • 给每个人对应的时间排序时,可以在结构体中重载,外面只要直接sort即可
  • 把string输出成char数组,用.c_str,可以返回这个string的char数组的指针
  • 注意在结构体内写重载运算符后面还有一个const

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <cstring>
using namespace std;

#define pb push_back
#define fi first
#define se second

const int N = 1010, M = 1440 * 31 + 10;

int cost[24];
double sum[M];

struct Record
{
    int minutes;
    string state;
    string format_time;
    
    bool operator<(const Record &t) const
    {
        return minutes < t.minutes;
    }
};

map<string, vector<Record>> persons;

int main()
{
    for (int i = 0; i < 24; i ++ ) cin >> cost[i];
    for (int i = 1; i < M; i ++ ) sum[i] = sum[i - 1] + cost[(i - 1) % 1440 / 60] / 100.0;
    
    int n; cin >> n;
//    string name, state, format_time;
    char name[25], state[10], format_time[20];
    int month, day, hour, minute;
    for (int i = 0; i < n; i ++ )
    {
        scanf("%s %d:%d:%d:%d %s", name, &month, &day, &hour, &minute, state);
        
        int minutes = (day - 1) * 1440 + hour * 60 + minute;
        sprintf(format_time, "%02d:%02d:%02d", day, hour, minute);
        
        persons[name].pb({minutes, state, format_time});
    }
    
    for (auto &person : persons)
    {
        auto name = person.fi;
        auto records = person.se;

        sort(records.begin(), records.end());

        double total = 0;
        for (int i = 0; i + 1 < records.size(); i ++ )
        {
            auto a = records[i], b = records[i + 1];
            if (a.state == "on-line" && b.state == "off-line")
            {
                if (!total) printf("%s %02d\n", name.c_str(), month);
                
                cout << a.format_time << ' ' << b.format_time << ' ';

                double c = sum[b.minutes] - sum[a.minutes];
                printf("%d $%.2lf\n", b.minutes - a.minutes, c);
                total += c;
            }
        }

        if (total) printf("Total amount: $%.2lf\n", total);
    }
}

1017 Queueing at Bank (25 分)

题意 :

  • 给n个人到的时间和要占用的时间和m个窗口
  • 来早了的要排队到开门,来晚了的不算入
  • 保证每个一个窗口可以被一个人占用超过1小时
  • 求平均等待时间

思路 :

  • 对于每个窗口我们只需要知道它是在什么时刻结束了上一个人的占用
  • 对于每个人要怎么安排呢?应该是安排到最早结束的那个窗口,所以我们每次要在所有窗口中找到最小值,所以可以用优先队列
  • 注意service_time要和60取一个min

做法 :

  • 把每个人的到达时间和占用时间都用结构体存下,因为还要根据到达时间遍历,因此结构体中重载运算符
  • 把m个窗口安排好,时间都是8点
  • 遍历每个人,如果来晚了,cointinue;找到当前结束时间最早最小的窗口,这个人的开始占用时间就是到达时间和最小结束时间中的最大值,总等待时间累加开始时间和到达时间之差,总人数++,将新的结束时间再放入窗口中

语法 :

  • 小根堆的定义
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

const int N = 1e4 + 10;

int n, m;

struct Person
{
    int arrive_time;
    int service_time;
    
    bool operator< (const Person &t) const
    {
        return arrive_time < t.arrive_time;
    }
}persons[N];

int main()
{
    scanf("%d%d", &n, &m);
    
    int hour, minute, second, service_time, arrive_time;
    for (int i = 0; i < n; i ++ )
    {
        scanf("%d:%d:%d %d", &hour, &minute, &second, &service_time);
        service_time = min(service_time, 60);
        
        arrive_time = hour * 3600 + minute * 60 + second;
        persons[i] = {arrive_time, service_time * 60};
    }
    
    sort(persons, persons + n);
    
    priority_queue<int, vector<int>, greater<int>> windows;
    
    for (int i = 0; i < m; i ++ ) windows.push(8 * 3600);
    
    int sum = 0, cnt = 0;
    for (int i = 0; i < n; i ++ )
    {
        auto person = persons[i];
        
        int w = windows.top();
        windows.pop();
        
        if (person.arrive_time > 17 * 3600) break;
        
        int start_time = max(w, person.arrive_time);
        sum += start_time - person.arrive_time;
        cnt ++ ;
        
        int end_time = start_time + person.service_time;
        windows.push(end_time);
    }
    
    printf("%.1lf\n", (double)sum / cnt / 60);
}

1026 Table Tennis (30 分)

思路 :

  • 考虑每个人,首先分成是否是vip放在两个优先队列内,重要的信息有 到达的时间(转换成秒数),和玩的时间
  • 考虑每张桌子,首先分成是否是vip桌子放在两个优先队列内,重要的信息有 编号,上一个人的结束时间

1035 Password (20 分)

  • 题意 :输入的每行的第二个字符串中按照题意替换字符,并且记录被替换过的这两个字符串,按要求输出
  • 思路 :数组记录即可,因为是按顺序一一对应的
  • 语法 :puts和printf在这种时候比较方便。
#include <iostream>

using namespace std;

const int N = 1010;

string name[N], pwd[N];

string change(string str)
{
    string res;

    for (auto c : str)
        if (c == '1') res += '@';
        else if (c == '0') res += '%';
        else if (c == 'l') res += 'L';
        else if (c == 'O') res += 'o';
        else res += c;

    return res;
}

int main()
{
    int n;
    cin >> n;
    
    int m = 0;
    for (int i = 0; i < n; i ++ )
    {
        string a, b;
        cin >> a >> b;
        
        string c = change(b);
        
        if (b != c) name[m] = a, pwd[m ++ ] = c;
    }
    
    if (!m)
    {
        if (n == 1) puts("There is 1 account and no account is modified");
        else printf("There are %d accounts and no account is modified", n);
    }
    else
    {
        cout << m << endl;
        for (int i = 0; i < m; i ++ ) cout << name[i] << ' ' << pwd[i] << endl;
    }
    
    return 0;
}

1036 Boys vs Girls (25 分)

题意 :

  • 找出男孩中分数最高的和女孩中分数最低的,分别输出姓名以及分数差

思路 :

  • 发现不需要把他们全部存下来排序,直接输入比较即可
  • 更新变量的条件有 1.比待更新变量更优;2.当前待更新变量还没有被赋值

语法 :

  • string.empty()表示这个字符串还没有被赋值过
  • string.size()
#include <iostream>
using namespace std;

int main()
{
    int n; cin >> n;
    
    string boy_name, boy_id;
    int boy_score;
    string girl_name, girl_id;
    int girl_score;
    
    string name, id, sex;
    int score;
    for (int i = 0; i < n; i ++ )
    {
        cin >> name >> sex >> id >> score;
        if (sex == "F")
        {
            if (girl_name.empty() || score > girl_score)
            {
                girl_score = score;
                girl_name = name;
                girl_id = id;
            }
        }
        else
        {
            if (boy_name.empty() || score < boy_score)
            {
                boy_score = score;
                boy_name = name;
                boy_id = id;
            }
        }
    }
    
    if (girl_name.empty()) puts("Absent");
    else cout << girl_name << ' ' << girl_id << endl;
    
    if (boy_name.empty()) puts("Absent");
    else cout << boy_name << ' ' << boy_id << endl;
    
    if (boy_name.empty() || girl_name.empty()) puts("NA");
    else cout << girl_score - boy_score << endl;
}

1050 String Subtraction (20 分)

  • 题意 :给两个字符串,在第一个字符串中将在第二个中出现过的字符全部删除
  • 语法 : g e t l i n e getline getline函数在 i o s t r e a m iostream iostream头文件中;unordered_set的count函数和insert函数
#include <iostream>
#include <unordered_set>

using namespace std;

int main()
{
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    
    unordered_set<char> hash;
    for (auto c : s2)   hash.insert(c);
    
    string res;
    for (auto c : s1)
        if (!hash.count(c))
            res += c;
    
    cout << res;
    
    return 0;
}

1060 Are They Equal (25 分)

题意 :

  • 给定一个机器能够保存的有效数字的位数,以及两个浮点数,求输出这两个浮点数保留后的形式以及是否相等

思路 :

  • 数字不一定标准,可能有前导零(以后这种格式转换类问题最好不要信题目说给float?);题目中提到d[1]>0 unless the number is 0,意思是除了0需要特殊处理,否则删去前导零
  • 如果数值是0,则指数规定为0
  • k就是原先小数点前有几个有效数字的意思,所以我们当然是去找’.’;这种表示方法(不是科学表示法)对小数点后的数字也可能用到,因此找到小数点位置后,后面的数字也可能要用到,就新建立一个字符串,是移除小数点的版本
  • 1.找到’.‘的位置,如果没有就在最后加上,且是最后一位;2.新的字符串中去掉原先的’.’;3.移除前导零,同时k–(比如0.0123 * 10 ^ 5,变成0.123 * 10 ^ 4);4.如果移除后发现新字符串空了,说明原先全部是0,k=0;5.如果长度大于n,截断,如果长度小于n,后面补零;6.返回

语法 :

  • string中find没找到的话返回-1
  • substr只传一个参数,用来截断
#include <iostream>
using namespace std;

string change(string a, int n)
{
    int k = a.find('.');
    if (k == -1) a += '.', k = a.find('.');
    
    string s = a.substr(0, k) + a.substr(k + 1);
    
    while (s.size() && s[0] == '0') s = s.substr(1), k -- ;
    
    if (s.empty()) k = 0;
    
    if (s.size() > n) s = s.substr(0, n);
    else s += string(n - s.size(), '0');
    
    return "0." + s + "*10^" + to_string(k);
}

int main()
{
    int n;
    string a, b;
    cin >> n >> a >> b;
    
    a = change(a, n);
    b = change(b, n);
    
    if (a == b) cout << "YES " << a;
    else cout << "NO " << a << ' ' << b;
}

1061 Dating (20 分)

  • 题意 :captive letter大写字母;case sensitive区分大小写;common共同的
  • 题意 :先找到第一二个字符串中第一个一样的且符合条件的大写字母,然后是第二个一样的且符合条件大写字母,然后找第三四个字符串中第一个符合条件且一样的字母
  • 思路 :要看清题目背后含义,字母范围;在第一个和第二个的输出中,如果写在同一个循环里,第一个满足后用了bool还不够,还要加一个continue,否则直接进入了第二个判断条件,而采用标准写法用两个while就没有这个问题;
  • 语法 :时间题常见用printf的%02d;printf选择句式;ASCII码中从小到大分别是,数字,大写字母,小写字母;或中的与不需要括号;a[k] - ‘A’ + 10
#include <iostream>

using namespace std;

int main()
{
    string a, b, c, d;
    cin >> a >> b >> c >> d;
    
    int k = 0;
    while (true)
    {
        if (a[k] == b[k] && 'A' <= a[k] && 'G' >= a[k]) break;
        k ++ ;
    }
    
    char weekdays[7][4] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};

    printf("%s ", weekdays[a[k] - 'A']);
    
    k ++ ;
    
    while (true)
    {
        if (a[k] == b[k] && (a[k] >= '0' && a[k] <= '9' || a[k] >= 'A' && a[k] <= 'N')) break;
        k ++ ;
    }
    
    printf("%02d:", a[k] <= '9' ? a[k] - '0' : a[k] - 'A' + 10);
    
    for (int i = 0;; i ++ )
        if (c[i] == d[i] && (c[i] >= 'a' && c[i] <= 'z' || c[i] >= 'A' && c[i] <= 'Z'))
        {
            printf("%02d", i);
            break;
        }
    
    return 0;
}

1073 Scientific Notation (20 分)

  • 题意 :科学计数法转数字
  • 思路 :当科学计数法系数>0时,有可能不仅无法加零,还去不了小数点;注意题目有个关键地方,无论这个数是正负,第一位是符号位
  • 语法 :string的find函数;substr若只有一个参数,那个参数是pos,返回包含pos在内后面的整个字符串;string函数,先长度后内容
#include <iostream>

using namespace std;

int main()
{
    string s;
    cin >> s;
    
    if (s[0] == '-') cout << '-';
    int k = s.find('E');
    
    string a = s[1] + s.substr(3, k - 3);
    int b = stoi(s.substr(k + 1));
    
    if (b <= 0) cout << "0." << string(- b - 1, '0');
    else if (b < a.size() - 1) a = a.substr(0, b + 1) + '.' + a.substr(b + 1);
    else a += string(b - a.size() + 1, '0');
    
    cout << a;
    
    return 0;
}

1077 Kuchiguse (20 分)

  • 题意 :给n个字符串,找这n个字符串最长的公共后缀( 2 < = N < = 100 2<=N<=100 2<=N<=100 m a x l e n < = 256 maxlen <= 256 maxlen<=256
  • 语法 :与getline搭配使用getchar!reverse在algorithm中;substr只传一个参数的妙用,后缀
#include <iostream>

using namespace std;

const int N = 110;

string s[N];

int main()
{
    int n;
    cin >> n;
    getchar();
    
    for (int i = 0; i < n; i ++ ) getline(cin, s[i]);
    
    for (int k = s[0].size(); k; k -- )
    {
        string sf = s[0].substr(s[0].size() - k);
        bool is_matched = true;
        
        for (int i = 1; i < n; i ++ )
            if (s[i].size() < k || s[i].substr(s[i].size() - k) != sf)
            {
                is_matched = false;
                break;
            }
        
        if (is_matched)
        {
            cout << sf;
            return 0;
        }
    }
    
    cout << "nai";
    
    return 0;
}

1082 Read Number in Chinese (25 分)

题意 :

1084 Broken Keyboard (20 分)

  • 题意 :The English letters must be capitalized英文字母必须大写
  • 题意 :给两个字符串,找第二个字符串中在第一个中没有出现的字符,无视大小写
  • 思路 :双指针即可,b中有的a中一定有,反之不一定,且按顺序,利用好这种性质,a为主指针,将b中与a一一比对;为了防止数组越界,要在b中最后加上一个a中没有出现过的字符
  • 语法 :char = toupper(char);ASCII码才127之间,且可以直接以char当数组下标;让一个数组全部都是某个具体数值的方法
#include <iostream>

using namespace std;

int main()
{
    string a, b;
    cin >> a >> b;
    
    bool st[200] = {0};
    
    b += '#';
    
    for (int i = 0, j = 0; i < a.size(); i ++ )
    {
        char x = toupper(a[i]), y = toupper(b[j]);
        if (x == y) j ++ ;
        else
        {
            if (!st[x]) st[x] = true, cout << x;
        }
    }
    
    return 0;
}

1108 Finding Average (20 分)

  • 题意 :number和numbers
  • 题意 :输入n个字符串,判断分别是否是合法数字(大小,小数点后位数,无效字符)
  • 思路 :看小数点后是否合法时,如果点在最后一位,num.size() - k就会是1,在倒数第二位,就会是2,倒数第三位等于3,在倒数第三位时后面有两位有效数字,所以大于三,就多于两位有效数字
  • 语法 :stof(float实数)可以帮我们判断输入字符串是否合法,如果不合法会抛出异常,所以只要写try,catch语句,如果是合法数字,再判断是否在正负一千以内,小数点后是否最多两位;但这个函数有一个问题5.2abc也被算作合法数字,它会看这个字符串的前几位能否构成合法实数, 如果能,它就只用前几位,所以这里还要判断最终位数。size_t是记录用了几个字符,如果用的字符的数量小于num.size,说明就是5.2abc形式,也不是合法的;**catch(…)**表示接收任何类型的异常;string.findk!=-1就是存在小数点;string.c_str();且以上这些不需要其它额外的头文件
#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    
    double sum = 0;
    int cnt = 0;
    
    while (n -- )
    {
        string num;
        cin >> num;
        double x;
        
        bool success = true;
        try
        {
            size_t idx;
            x = stof(num, &idx);
            if (idx < num.size()) success = false;
        }
        catch(...)
        {
            success = false;
        }
        
        if (x < -1000 || x > 1000) success = false;
        int k = num.find('.');
        if (k != -1 && num.size() - k > 3) success = false;
        
        if (success) cnt ++ , sum += x;
        else printf("ERROR: %s is not a legal number\n", num.c_str());
    }
    
    if (cnt > 1) printf("The average of %d numbers is %.2lf", cnt, sum / cnt);
    else if (cnt == 1) printf("The average of 1 number is %.2lf", sum);
    else printf("The average of 0 numbers is Undefined");
    
    return 0;
}

1124 Raffle for Weibo Followers (20 分)

  • 题意 :给n个字符串,输出从开始位置每隔m个位置的字符串,要跳过已经被输出过的
  • 思路 :模拟就是从第一个开始的位置输出,然后每次跳到n个位置后,如果跳到的位置已经被输出过,那就跳过;索性用数组记录位置对应的字符串,就不用for了;用set判断是否已经被输出过以及有没有输出过字符串。
#include <iostream>
#include <unordered_set>

using namespace std;

const int N = 1e3 + 10;

string name[N];

int main()
{
    int m, n, s;
    cin >> m >> n >> s;
    
    unordered_set<string> se;
    
    for (int i = 1; i <= m; i ++ ) cin >> name[i];
    
    int k = s;
    while (k <= m)
    {
        if (se.find(name[k]) != se.end()) k ++ ;
        else
        {
            cout << name[k] << endl;
            se.insert(name[k]);
            k += n;
        }
    }
    
    if (se.empty()) cout << "Keep going...";
    
    return 0;
}

1141 PAT Ranking of Institutions (25 分)

语法 :

  • 注意本题的数据对精度的要求比PAT高;因为本题中有除法,可能除不尽,由于我们算的不是总分/1.5,而是一个乙级读进来就/1.5,这样精度会有一些欠缺
  • 本题对精度要求较高,为了避免出现真实的总分是124,但用浮点数存储的是123.999999999的情况,建议在将整数取整之前加上eps,比如eps可以取 1 0 − 8 10^{-8} 108
  • 将输入的字符串转小写
#include <iostream>
#include <cstring>
#include <unordered_map>
#include <vector>
#include <algorithm>

using namespace std;

struct School
{
    string name;
    int cnt;
    double sum;

    School(): cnt(0), sum(0) {}

    bool operator< (const School &t) const
    {
        if (sum != t.sum) return sum > t.sum;
        if (cnt != t.cnt) return cnt < t.cnt;
        return name < t.name;
    }
};

int main()
{
    int n;
    cin >> n;

    unordered_map<string, School> hash;
    while (n -- )
    {
        string id, sch;
        double grade;
        cin >> id >> grade >> sch;

        for (auto& c : sch) c = tolower(c);

        if (id[0] == 'B') grade /= 1.5;
        else if (id[0] == 'T') grade *= 1.5;

        hash[sch].sum += grade;
        hash[sch].cnt ++ ;
        hash[sch].name = sch;
    }

    vector<School> schools;
    for (auto item : hash)
    {
        item.second.sum = (int)(item.second.sum + 1e-8);
        schools.push_back(item.second);
    }

    sort(schools.begin(), schools.end());
    cout << schools.size() << endl;

    int rank = 1;
    for (int i = 0; i < schools.size(); i ++ )
    {
        auto s = schools[i];
        if (i && s.sum != schools[i - 1].sum) rank = i + 1;
        printf("%d %s %d %d\n", rank, s.name.c_str(), (int)s.sum, s.cnt);
    }

    return 0;
}

1153 Decode Registration Card of PAT (25 分)

思路 :

  • 输出按人数非递增顺序,格式为 考场编号 总人数。若人数并列则按考场编号递增顺序输出。,因此for (auto item : hash) rooms.push_back({-item.second, item.first});,因此可以直接sort(rooms.begin(), rooms.end());,输出的时候printf("%s %d\n", room.second.c_str(), -room.first);
#include <iostream>
#include <cstring>
#include <unordered_map>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 10010;

int n, m;
struct Person
{
    string id;
    int grade;

    bool operator< (const Person &t) const
    {
        if (grade != t.grade) return grade > t.grade;
        return id < t.id;
    }
}p[N];

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++ ) cin >> p[i].id >> p[i].grade;

    for (int k = 1; k <= m; k ++ )
    {
        string t, c;
        cin >> t >> c;

        printf("Case %d: %s %s\n", k, t.c_str(), c.c_str());
        if (t == "1")
        {
            vector<Person> persons;
            for (int i = 0; i < n; i ++ )
                if (p[i].id[0] == c[0])
                    persons.push_back(p[i]);

            sort(persons.begin(), persons.end());

            if (persons.empty()) puts("NA");
            else
                for (auto person : persons) printf("%s %d\n", person.id.c_str(), person.grade);
        }
        else if (t == "2")
        {
            int cnt = 0, sum = 0;
            for (int i = 0; i < n; i ++ )
                if (p[i].id.substr(1, 3) == c)
                {
                    cnt ++ ;
                    sum += p[i].grade;
                }

            if (!cnt) puts("NA");
            else printf("%d %d\n", cnt, sum);
        }
        else
        {
            unordered_map<string, int> hash;
            for (int i = 0; i < n; i ++ )
                if (p[i].id.substr(4, 6) == c)
                    hash[p[i].id.substr(1, 3)] ++ ;

            vector<pair<int, string>> rooms;
            for (auto item : hash) rooms.push_back({-item.second, item.first});

            sort(rooms.begin(), rooms.end());
            if (rooms.empty()) puts("NA");
            else
                for (auto room : rooms)
                    printf("%s %d\n", room.second.c_str(), -room.first);
        }
    }

    return 0;
}

透明质酸钠
关注 关注
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PAT甲级】常用专业术语单词总结
云端筑梦师
03-10 453
单词 意思 even number 偶数 destination 目的地 hence 因此
【置顶】【PATPAT甲级题目及分类总结(持续更新ing)
热门推荐
elegant coder
04-29 5万+
在2019年3月底,我决定考浙大计院,经过一个月还算凑合的学习,痛定思痛,决定整理整理自己的博客。 粗略估计,大概一个月的时间里我AC了31道题,大概用时40个小时上下,毕竟还要把大部分时间花在笔试上。一开始使用Java,到十几题的时候发现有的题真的Java很难通过,痛定思痛转Cpp。这里告诫读者,千万换Cpp而不是继续Java,毕竟我们的目标是满分。 我在算法题上有点小基础,前后两次参加蓝桥杯,...
PAT甲级题目翻译+答案 AcWing(树)
m0_51448653的博客
12-07 1690
1020 Tree Traversals (25 分) 题意 : binary tree二叉树;postorder and inorder traversal sequences后序遍历和中序遍历;level order traversal sequence层序遍历 思路 : 后序中找到根结点,中序中根结点左边是左子树,右边是右子树,知道了它们的长度就可以在后序中找到左右子树分别的根结点;这样就可以把整颗树重建; 用l和r两个哈希表记录每个根结点的两个儿子,也就是两个新的根结点 从根结点开始bfs,层
PAT甲级题目翻译+答案 AcWing(排序)
m0_51448653的博客
12-06 490
1012 The Best Rank (25 分) 题意 :给ID和3门成绩,计算其平均分A,输出每位学生最好的排名,A>C>M>E 思路 :如果将所需的若干个元素中使第一个元素为后几个的平均值;容器内二分找值;题目所给ACME决定了搜索顺序,因此决定了容器顺序;二分时,如果是倒序的,就应该找最前面的,这里我们为了省事不写cmp说明是从小到大的,那么我们要找的就是最后一个,最后一个等于x的数的位置,然后如果说r是a.size() - 1,说明排名是第一,那么返回1,也就是说返回值是a.s
PAT甲级题目翻译+答案 AcWing(链表)
m0_51448653的博客
12-07 249
1032 Sharing (25 分) 题意 : suffix后缀;prefix前缀 每个结点存一个字母,一共存两个单词 分别给两个单词的第一个字母的地址以及总共的结点数 给出所有结点的地址数值和下一个结点的地址(null就是-1) 要求这两个单词最长公共后缀的起始位置的结点的地址,没有就输出-1 思路 : 讲了一堆,模拟样例一发现就是找到两个链表中第一个拥有相同地址的结点,并输出这个地址,如果没有这个结点,就输出-1 只要把第一个链表中每个地址都标记,遍历第二个链表的时候如果当前这个结点的地址被标记
PAT甲级题目翻译+答案 AcWing(数学)
m0_51448653的博客
12-06 759
1081 Rational Sum (20 分) 题意 :rationnal numbers有理数;numerator/denominator分子/分母;integer part整数部分;fractional part小数部分 题意 :给n个分数,求和,要写成真分数且约分 思路 :初始化a为0,b为1;输出时 :如果分母是1,直接输出整数部分就可以;如果a>b,说明有整数部分和小数部分;pat上分子和分母数据范围是long int,相当于是int,而acwing是long long,如果没有中间那步
ACM-PAT甲级题目总结及实现
03-24
4. **字符串处理**:PAT甲级字符串问题频繁出现,包括KMP算法、Manacher's Algorithm、后缀自动机等,用于高效处理字符串匹配和模式查找。 5. **图论**:图的深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径...
Acwing】PAT甲级辅导课
wei2019_的博客
04-14 1273
PAT甲级辅导课第九章 哈希表AcWing1532.找硬币AcWing1549.集合相似度AcWing1610.朋友数AcWing1637.漏掉的数字AcWing1642.危险品装箱AcWing1564.哈希AcWing1630.期终成绩AcWing1638.哈希-平均查找时间 第九章 哈希表 AcWing1532.找硬币 #include <iostream> #include <unordered_set> using namespace std; int main() {
C++PAT甲级题目实现
01-07
为了记录我在准备PAT甲级的练习,特开此页。 在练习的过程中吸收了大量博主的经验,特别是大神柳婼:https://blog.csdn.net/liuchuo。 但是由于代码风格的不同,我在学习他们的想法的同时也在努力形成自己的C++代码...
PAT(甲级) A+B Format
01-07
把数字转化为字符串,倒序输出 大神的都是数字直接转为字符串,学到了 代码 第一个测试点不过,有会的可以帮我看看吗,万分感谢 现在做pat不过一个测试点我也能慢慢接受了,呜呜呜 我的 #include #include using ...
PAT题库甲级题目1-110题答案代码.rar
04-19
PAT题库甲级题目1-110题答案代码,均能通过OJ测试,
PAT甲级题目翻译+答案 AcWing(模拟)
m0_51448653的博客
12-06 3146
1008 Elevator (20 分) 思路 :last可能等于cur,而无论是否相等,res都是+5的 #include <iostream> using namespace std; int main() { int n; cin >> n; int res = 0, last = 0; while (n -- ) { int cur; cin >> cur;
PAT甲级题目翻译+答案 AcWing(高精度)
m0_51448653的博客
12-05 457
1002 A+B for Polynomials (25 分) 题意 :给两个多项式,输出两个多项式相加结果的系数和次数 思路 :用double数组记录多项式,正好数组下标是整数,系数是double #include <iostream> using namespace std; const int N = 1010; double a[N], b[N], c[N]; int main() { int k; cin >> k; while
PAT典型题目(1)字符串
nowacoder的博客
02-09 267
1009. 说反话 (20)时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没...
PAT甲级 英文词组翻译
成长日记的博客
01-10 673
数据的要求 standard format 标准格式 a pair of 一双(一般是每组测试有两个数) rearrange 重新排列 数据描述 polynomial 多项式 exponent 指数 coefficient 系数 respectively 依次为...
PAT---字符串处理题总结
chstor's blog
05-10 220
sscanf与sprintf是处理字符串问题的利器, sscanf从单词上可以理解为string+scanf,(从左往右) sprintf则可以理解为string+printf,均在stdio.h头文件下。(从右往左) sscanf(s,"%lf",&num); sprintf(s1,"%.2f",num); 写题常用的: to_string():int 转string stoi():string转换为int,s[i]是char,不符合参数要求,可以用s.substr(i,1)返回子串
PAT甲级真题:字符串系列题解
m0_52806260的博客
06-21 362
PAT甲级真题:字符串
PAT/C++甲级题解——字符串操作
Sueed
11-29 348
第一章:字符串处理 ​ 1152、1140、1136、1112、1108 ①常用头文件 #include <iostream> #include <cstring> #include <map> 二维数组 #include <set> 非重复 using namespace std; ②常用函数 substr(starting_position, length) 用于字符串操作中产生子串 starting_position:主串中开始产生子串的位置
分享一个做PAT乙级字符串题目的小技巧
haohulala的博客
04-19 341
其实这个小技巧很多人应该都知道,就是在做字符串处理的时候可以将输入串映射到128*4字节大小的int数组里,然后用输入得到的字符的ascii码值作为索引进行哈希,数组值可以存储当前字符出现的次数,也可以用作别的用途,具体看题目要求。 这个方法非常好用,下面举一个小栗子 1042字符统计(20分) 题目传送门https://pintia.cn/problem-sets/99480526...
PAT甲级编程题目分类与精华摘要
这些PAT(A Level)编程竞赛题目涵盖了多个计算机科学和技术领域,包括字符串处理、哈希表应用和图论。以下是对这些题目所涉及知识点的详细解释: 1. **字符串处理**: - **1112 Stucked Keyboard**:修复键盘坏损...
写文章

热门文章

  • 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(jQuery3) 8719
  • 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(jQuery2) 7957
  • 2021 软考 软件设计师考试教程(详细版) 7885
  • SQL进阶教程 | 史上最易懂SQL教程 5小时零基础成长SQL大师(1) 6034
  • endnote21从安装到使用!文献引用!Mac版 5745

分类专栏

  • 前缀和与差分 5篇
  • 递推与递归 1篇
  • 人工智能 1篇
  • dp 16篇
  • 背包 2篇
  • 数论 8篇
  • 二分与三分 4篇
  • 贪心 4篇
  • c++语法 1篇
  • 位运算 7篇
  • python刷题 1篇
  • jsp 1篇
  • 工具 1篇
  • dfs 13篇
  • bfs 6篇
  • 2篇
  • 2篇
  • Trie 1篇
  • kmp 1篇
  • 哈希 3篇
  • 后端 1篇
  • 链表 3篇
  • 基本数据结构 2篇
  • 倍增 1篇
  • 思维 3篇
  • 二叉树 5篇
  • 最短路 4篇
  • 概率 1篇
  • 模拟 12篇
  • 双指针 1篇
  • LCA 3篇
  • 打表 1篇
  • 计算几何 2篇
  • 博弈论 1篇
  • 期望 1篇
  • 循环队列 1篇
  • 操作系统 1篇
  • 二分图 2篇
  • 滑动窗口 1篇
  • 并查集 2篇
  • 构造 1篇
  • 二叉搜索树 1篇
  • 哈夫曼树 1篇

最新评论

  • RC-u5 树与二分图

    柚131: 好牛的思路表情包

  • 操作系统 PV同步问题 每日一题 合集

    菜腿1994: 博主准备考研了吗?什么专业

  • 王道计算机考研 数据结构 (绪论、线性表)

    菜腿1994: 大佬买的哪本书看的,推荐下

  • SpringBoot笔记(二)Git版本控制

    ALangiu: 宝藏博主,继续更新,好详细好喜欢

  • 7-2 芬兰木棋

    青衣素人: 为什么处理 1 1 1 -1 -1 1 数据所需的次数为一次? 这个不用考虑方向的依据没看懂。按照题意不是一次只能一个方向,难不成是回旋镖。。。

最新文章

  • 动手学深度学习(李沐)PyTorch 第 2 章 预备知识
  • 动手学深度学习(李沐)PyTorch 第 1 章 引言
  • PyTorch深度学习快速入门教程【土堆】基础知识篇
2024年20篇
2023年33篇
2022年253篇
2021年207篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢鹿雕塑摆件加工凤凰玻璃钢雕塑价格长沙玻璃钢彩绘雕塑定制阳泉玻璃钢仿铜雕塑定制商场美陈布置线条玻璃钢彩绘雕塑报价松原玻璃钢雕塑定制价格梅州仿真玻璃钢雕塑丹东玻璃钢雕塑批发庆阳玻璃钢卡通雕塑公司武陵玻璃钢雕塑厂家河南泡沫玻璃钢仿铜雕塑定制卡通雕塑玻璃钢平台公仔玻璃钢雕塑规格铜陵彩绘玻璃钢雕塑玻璃钢雕塑的成本多少珠海玻璃钢雕塑价钱甘肃玻璃钢雕塑安装百货商场美陈费用山西特色玻璃钢雕塑优势玻璃钢造型雕塑平台联系方式室内玻璃钢雕塑公司玻璃钢雕塑是什么玻璃淮南环保玻璃钢雕塑市场云南商场美陈雕塑仿铜玻璃钢雕塑制作流程阜阳校园玻璃钢雕塑价格铜川公园玻璃钢雕塑欧式罗马玻璃钢花盆衢州步行街玻璃钢雕塑多少钱香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化