1038 统计同成绩学生 (20 分)
本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。
输入格式:
输入在第 1 行给出不超过 105 的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。
输出格式:
在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。
样例:">输入样例:
10
60 75 90 55 75 99 82 90 75 50
3 75 90 88
输出样例:
3 2 0
代码:
#include<iostream>
using namespace std;
int main(){
//设置score数组,通过成绩作为数组下标的方式检索人数
int score[110] = {0}, person, temp;
cin >> person; //总人数
for (int i = 0; i < person; i++){
cin >> temp;
score[temp]++; //成绩对应的数组下标人数+1
}
cin >> person; //检索成绩的个数
for (int i = 0; i < person; i++){
cin >> temp;
//PAT特色输出,输出成绩对应下标的元素
if (i != person - 1){
cout << score[temp] << ' ';
}
else{
cout << score[temp];
}
}
return 0;
}
1039 到底买不买 (20 分)
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
输入格式:
每个输入包含 1 个测试用例。每个测试用例分别在 2 行中先后给出摊主的珠串和小红想做的珠串,两串都不超过 1000 个珠子。
输出格式:
如果可以买,则在一行中输出 Yes
以及有多少多余的珠子;如果不可以买,则在一行中输出 No
以及缺了多少珠子。其间以 1 个空格分隔。
输入样例 1:
ppRYYGrrYBR2258
YrR8RrY
输出样例 1:
Yes 8
输入样例 2:
ppRYYGrrYB225
YrR8RrY
输出样例 2:
No 2
代码:
#include<iostream>
#include<string>
using namespace std;
int main() {
string str1, str2; //str1为摊主的珠子,str2为想要的珠子
cin >> str1;
//通过标记字符ASCII码的方式解决问题
int colour[128] = { 0 }, len1 = str1.length(), temp = 0;
//遍历str1数组,得到其字符元素的ASCII码,通过该ASCII码作为下标得到各字符出现频次
for (int i = 0; i < len1; i++) {
temp = str1[i];
colour[temp]++;
}
cin >> str2;
int len2 = str2.length();
//遍历str1数组,得到其字符元素的ASCII码,在对应ASCII码下标的数组元素中减去其出现频次
for (int i = 0; i < len2; i++) {
temp = str2[i];
colour[temp]--;
}
//通过yesOrNot标记是否满足需要
bool yesOrNot = true;
temp = 0;
//遍历ASCII码数组,如果出现负数,则说明摊主的珠子不能满足需要,并且,累加差额
for (int i = 0; i < 128; i++) {
if (colour[i] < 0) {
yesOrNot = false;
temp -= colour[i];
}
}
if (yesOrNot) {
cout << "Yes " << len1 - len2;
}
else {
cout << "No " << temp;
}
return 0;
}
1042 字符统计 (20 分)
请编写程序,找出一段给定文字中出现最频繁的那个英文字母。
输入格式:
输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。
输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。
输入样例:
This is a simple TEST. There ARE numbers and other symbols 1&2&3...........
输出样例:
e 7
代码:
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
//不能使用cin >> str; 这种方式遇到空格就会停止输入
getline(cin,str);
int len = str.length(), count[130] = {0}, temp = 0;
//遍历字符串
for (int i = 0; i < len; i++){
//如果碰到大写字母,则转换其为小写
if (str[i] >= 'A' && str[i] <= 'Z'){
str[i] += 32;
}
//统计每种小写字母出现的频次
if (str[i] >= 'a' && str[i] <= 'z'){
temp = str[i];
count[temp]++;
}
}
temp = -1;
int max = -1;
//遍历ASCII码数组,得到最高频次的小写字母及其出现频次
for (int i = 0; i < 130; i++){
if(count[i] > max){
max = count[i];
temp = i;
}
}
char res = temp;
cout << res << ' ' << max;
return 0;
}
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;
}