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