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; }