PAT乙级(散列) 1038、1039、1042、1043、1047、1005(二)

简介: PAT乙级(散列) 1038、1039、1042、1043、1047、1005

1043 输出PATest (20 分)

给定一个长度不超过 104 的、仅由英文字母构成的字符串。请将字符重新调整顺序,

PATestPATest.... 这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过 104 的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

redlesPayBestPATTopTeePHPereatitAPPT

输出样例:

PATestPATestPTetPTePePee

代码:

#include<iostream>
#include<string>
#define total 6
using namespace std;
//建立字符型数组,用于匹配得到次序
char sq[total] = {'P', 'A', 'T', 'e', 's', 't'};
//将字母转换为中"PATest"中的次序
int transferNum(char a){
    int rank = 0;
    //如果是"PATest"中的字母,则返回次序
    for (int i = 0; i < total; i++){
        if (sq[i] == a){
            rank = i;
            return rank;
        }
    }
    //如果不是,则统一返回total
    return total;
}
int main(){
    string str;
    cin >> str;
    //arr数组的个数为total + 1
    int len = str.length(), temp, arr[total + 1] = { 0 };
    for (int i = 0; i < len; i++){
        temp = transferNum(str[i]);
        arr[temp]++;
    }
    int max = -1;
    //找到最多要输出几轮
    for (int i = 0; i < total; i++){
        if (arr[i] > max) max = arr[i];
    }
    for (int i = 0; i < max; i++){
        //按照sq字符数组的顺序按序输出
        for (int j = 0; j < total; j++){
            if (arr[j] > 0){
                cout << (sq[j]);
            }
            //每次循环当前字符个数-1
            arr[j]--;
        }
    }
    return 0;
}

1047 编程团体赛 (20 分)

编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。

现给定所有队员的比赛成绩,请你编写程序找出冠军队。

输入格式:

输入第一行给出一个正整数 N(≤104),即所有参赛队员总数。随后 N 行,每行给出一位队员的成绩,格式为:队伍编号-队员编号 成绩,其中队伍编号为 1 到 1000 的正整数,队员编号为 1 到 10 的正整数,成绩为 0 到 100 的整数。

输出格式:

在一行中输出冠军队的编号和总成绩,其间以一个空格分隔。注意:题目保证冠军队是唯一的。

输入样例:

6
3-10 99
11-5 87
102-1 0
102-3 100
11-9 89
3-2 61

输出样例:

11 176

代码:

#include<iostream>
#include<string>
using namespace std;
int main() {
    int person, teamNum[1010] = { 0 }, len = 0, teamTemp = 0, temp = 0, score = 0, bestScore = -1, bestTeam = -1;
    cin >> person;
    //加getchar,防止getline将回车当成字符串
    getchar();
    string str;
    for (int i = 0; i < person; i++) {
        getline(cin, str);
        len = str.length();
        //取出字符串中的队伍编号
        for (teamTemp = 0, temp = 0; str[temp] != '-'; temp++) {
            teamTemp *= 10;
            teamTemp = teamTemp + str[temp] - '0';
        }
        //将temp向后推进到空格
        while (str[temp] != ' ') {
            temp++;
        }
        //取出字符串中的成绩
        for (score = 0, temp++; temp < len; temp++) {
            score *= 10;
            score = score + str[temp] - '0';
        }
        //累加当前队伍的成绩
        teamNum[teamTemp] += score;
        //判断当前队伍的成绩是否为最佳,如果为最佳,更新最佳队伍和最佳成绩
        if (teamNum[teamTemp] > bestScore) {
            bestTeam = teamTemp;
            bestScore = teamNum[teamTemp];
        }
    }
    cout << bestTeam << ' ' << bestScore;
    return 0;
}

1005 继续(3n+1)猜想 (25 分)

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

输入格式:

每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。

输出格式:

每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

输入样例:

6
3 5 6 7 8 11

输出样例:

7 6

代码:

#include<iostream>
using namespace std;
int main() {
    //number数组用来标记输入的数据,tempNum数组用来标记每个输入数据到1的计算中间值
    int count, number[120] = { 0 }, tempNum[120] = { 0 }, temp = 0, max = -1;
    cin >> count;
    //循环输入count个数据
    for (int i = 0; i < count; i++) {
        cin >> temp;
        //输入数据后,在number数组的对应下标+1
        number[temp]++;
        //判断当前已输入数据的最大值
        if (temp > max) max = temp;
        while (temp != 1) {
            //对其进行奇数偶数判断并进行相应操作
            if (temp % 2 == 0) {
                temp /= 2;
            }
            else {
                temp = (temp * 3 + 1) / 2;
            }
            //如果当前的数字小于110,则存入相应的中间值数组下标元素中
            if (temp <= 110) tempNum[temp]++;
        }
    }
    //将count归零,用于记录一共需要输出几个数据
    count = 0;
    //如果当前下标的值是输入的,并且是中间值,则count+1
    for (int i = max; i > 0; i--) {
        if (number[i] != 0 && tempNum[i] == 0) {
            count++;
        }
    }
    //PAT特色输出
    for (int i = max; i > 0; i--) {
        if (number[i] != 0 && tempNum[i] == 0) {
            if (count > 1) {
                cout << i << " ";
                count--;
            }
            else cout << i;
        }
    }
    return 0;
}




相关文章
|
存储 算法 索引
蓝桥杯丨哈希算法
蓝桥杯丨哈希算法
60 0
|
7月前
|
算法 测试技术 C#
【菲蜀定理 子序列】1250 检查「好数组」
【菲蜀定理 子序列】1250 检查「好数组」
|
6月前
|
存储 算法 数据可视化
【漫画算法】哈希表:古代皇帝的秘密魔法书
【漫画算法】哈希表:古代皇帝的秘密魔法书
|
7月前
|
人工智能 C++
c++实现 离散数学 “自反 对称 ” 详解
c++实现 离散数学 “自反 对称 ” 详解
|
6月前
|
算法 C++
【c/c++算法】曼哈顿算法简单运用
【c/c++算法】曼哈顿算法简单运用
117 0
|
7月前
|
算法 测试技术 C#
【数学】【深度优先搜索】【图论】【欧拉环路】753. 破解保险箱
【数学】【深度优先搜索】【图论】【欧拉环路】753. 破解保险箱
|
存储 缓存 Shell
【C++杂货铺】一文带你走进哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列
【C++杂货铺】一文带你走进哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列
96 0
【C++杂货铺】一文带你走进哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列
|
7月前
|
算法
PAT甲级真题1015 可逆质数
PAT甲级真题1015 可逆质数
45 0
|
C++
【PAT甲级 - C++题解】1078 Hashing
【PAT甲级 - C++题解】1078 Hashing
66 0
|
测试技术
PAT乙级(散列) 1038、1039、1042、1043、1047、1005(一)
PAT乙级(散列) 1038、1039、1042、1043、1047、1005
68 0
PAT乙级(散列) 1038、1039、1042、1043、1047、1005(一)