元音字母
元音字母
原题链接:https://oj.haizeix.com/problem/477
给定一个只包含大写字母 A − Z 的字符串,找到相邻两个元音字母之间间隔最大的距离。注:元音字母为 AEIOU
思路:记录上一个元音字母的位置last,以及当前访问的元音字母的位置i,计算最大距离判断是否更新ans的结果。如此循环
题解1逻辑有些混乱
1234567891011121314151617181920212223bool check(char c) { if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') return true; return false;}int func(string str) { int index[2]; int maxlen = 0; int flag = 0; for (int i = 0; i < str.length(); ++i) { if (flag && check(str[i])) { index[1] = i; int newlen = index[1] - index[0]; if (newlen > maxlen) maxlen = newlen; index[0] = index[1]; } if (!flag && check(str[i])) {//第1个元音字母 index[0] = i; flag = 1; } } return maxlen;}
题解2对首个元音字母的处理 进行逻辑优化
12345678910111213141516171819bool check(char c) { if (c == 'A' || c = ...
乒乓球
乒乓球
原题链接:https://oj.haizeix.com/problem/479
国际乒联前主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。
其中 11 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 11 分制和 21 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 11 分制和 21 分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中 W 表示华华获得一分,L 表示华华对手获得一分):
1WWWWWWWWWWWWWWWWWWWWWWLW
在 11 分制下,此时比赛的结果是华华第一局 11 比 0 获胜,第二局 11 比 0 获胜,正在进行第三局,当前比分 1 比 1。
而在 21 分制下,此时比赛结果是华华第一局 21 比 0 获胜,正在进行第二局,比分 2 比 1。
如果一局比赛刚开始,则此时比分为 0 比 0。直到分差大于或者等于 2,才一局结束。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
输入:每个输入文件包含若干行字符串,字符串有大写的 W、L 和 E 组成。其中 E 表示比赛信息结束,程序应该忽略 E 之后的所有内容。
输出:输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 11 分制下的结果,第二部分是 21 分制下的结果,两部分之间由一个空行分隔。
样例:
12WWWWWWWWWWWWWWWWWWWWWWLWE
12345611:011:01:121:02:1
试解版本1代码冗余!且没有数据的保存(输出后立刻丢失)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<iostream>using namespace std;void func11(string str) { if (str[0] == ' ...
保龄球
保龄球
原题链接:https://oj.haizeix.com/problem/480
打保龄球是用一个滚球去打击十个站立的柱,将柱击倒。
一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。
一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:
若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加两次滚球,不妨称其为第十一轮和第十二轮,并不是所有的情况都需要滚第十一轮和第十二轮球)。该轮得分为本次击倒柱数 10 与以后两次滚球所击倒柱数之和。
若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为这两次共击倒柱数 10 与以后一次滚球所击倒柱数之和。
若某一轮两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。
总之,若—轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。
下面以实例说明如下(字符“/”表示击倒当前球道上的全部的柱):
1234轮 1 2 3 4 5 6 7 8 9 10 11 12击球情况 / / / 72 9/ 81 8/ / 9/ / 8/每轮得分 30 27 19 9 18 9 20 20 20 20累计总分 30 57 76 85 103 112 132 152 172 192
现在请你编写一个保龄球实时计分程序,用来计算和显示结束后的得分情况。
样例:
1/ / / 72 9/ 81 8/ / 9/ / 8/
1192
试解思路:先将所有数据输入存储起来,再去从前向后遍历 进行数据的处理
123456789101112131415161718192021222324252627282930313233343536373839#incl ...
冰壶比赛
冰壶比赛
原题链接:https://oj.haizeix.com/problem/481
在冰壶比赛中给出一个目标点 P 以及一个规定的正整数 r,每一局由甲和乙两队轮流投冰壶各 88 次后该局比赛结束。
此时哪一方的冰壶最终离目标点最近,该方得分另一方不得分。
得分方离目标点 P 距离小于或等于 r,位置较另一队所有冰壶都更接近目标点 P 的冰壶都可以得1分(比赛最多进行 10 局)
双方之间的某局比赛结束后落后一方可以弃权,此时比赛不再进行下去。
已知某一局结束时,双方的每个冰壶离目标点 P 的距离以及正整数 r,请写一个程序判断两队之间每一局比赛的得分,以及总得分。
输入
第 1 行一个正整数 r。
以下有若干行,表示对局,每一行 8 个正整数;
第 2 行的第 j 个数表示第 1 局比赛结束时,甲方的第 j 个冰壶距离目标点 P 的距离;
第 3 行的第 j 个数表示第 1 局比赛结束时,乙方的第 j 个冰壶距离目标点 P 的距离;
……
第 2k 行的第 j 个数表示第 k 局比赛结束时,甲方的第 j 个冰壶距离目标点 P 的距离;
第 2k+1 行的第 j 个数表示第 k 局比赛结束时,乙方的第 j 个冰壶距离目标点 P 的距离;
如果有一方中途弃权,则最后一行(偶数行)只有一个整数 −1,表示此时发生弃权情况;
比赛最多进行 10 局,若输入多于 21 行,请忽略 21 行后的所有内容。
输出
输出若干行,每行两个整数,中间以冒号分隔,表示每一局比赛甲乙双方的比分(甲得分在前)。
最后一行有 2 个整数,中间以冒号分隔,表示甲乙双方比赛的最终得分(甲得分在前)。
样例:
123456789//样例185 20 18 19 3 15 13 320 2 17 12 5 18 10 1120 3 4 1 2 11 9 21 15 19 9 8 14 11 1015 2 10 1 19 14 3 1815 17 21 19 24 32 19 26-1
12340:10:03:03:1
123456789101112131415161718192021//样例285 20 18 19 3 15 13 320 2 17 12 5 18 10 1120 3 4 1 2 11 9 21 15 19 9 8 14 11 1015 2 10 1 19 ...
垃圾邮件
垃圾邮件
原题链接:https://oj.haizeix.com/problem/483
一个有效的邮箱地址包含以下几点要求:
地址是由小写英文字母、英文的句号 “.” 和一个 “@” 字符组成的字符串。
紧靠 “@” 字符左边和右边的两个字符必须是一个字母,地址的第一个和最后一个字符不能是 “.”。
比如,”mama@ta..ta” “m.am.a@t..a.t..a” 和 “m@t” 都是有效的,而 “ma@” “@ma.ma” “.mama@tata” 和 “ma.ma@tata.tata.” 不是。
可以这样来打乱自己的自制:
将 “@” 符号替换为 “at”
在地址的任意位置(包括首尾)插入0或1次 “nospam”
现在需要编写一个程序,给定一个打乱过的地址,还原出所有可能的原始有效地址。
输入
一行一个打乱过的地址,长度不超过 100。
输出
按照字典序从小到大输出所有可能的原始有效地址,每行输出一个。
样例:
1nospammamaattatahr
1234mama@tatahrmamaatt@ahrnospammama@tatahrnospammamaatt@ahr
参考代码==思路==:对string的操作
先在给定的字符串中寻找nospam字符串,有几个删除几个,将所有的可能都存在ans数组中。
将at字符替换为@,如果有很多at则逐个尝试,将所有可能的情况存到ans数组中
对ans中所有的情况,按照字典序进行sort排序后输出。
1
柱状统计图
柱状统计图
原题链接:https://oj.haizeix.com/problem/484
给出一些字符串,总长度不超过1000,统计其中大写字母的个数,并按照给定样例格式输出。
输入
一堆字符串,每两个字符串之间可能用空格、换行隔开。
输出
参照样例输出柱状统计图,每个 * 表示出现一次,注意每行不要有多余的空格。
样例:
12ABC ABC.DEF()G GCC XY354342aaaCaa aaaaaaaabcdbcd
123456 * * ** * * ** * * * * * * * *A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
参考代码思路:
大写字母统计string str[1000] cin >> str;,对应的字符数量增加num[str['A']]++;
统计结果输出
确定图形高度(最多数量的字母的数量)
每一行确定输出到哪里
进行输出
1
均分纸牌
均分纸牌
原题链接:https://oj.haizeix.com/problem/485
有 N 堆纸牌,编号分别为 1,2,…,N。
每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。
移牌规则为:
在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N−1 的堆上;
其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
例如 N=4,4堆纸牌数分别为:① 9 ② 8 ③ 17 ④ 6
移动 3 次可达到目的:
从 ③ 取 4 张牌放到 ④ (9,8,13,10)-> 从 ③ 取 3 张牌放到 ②(9,11,10,10)-> 从 ② 取 1 张牌放到①(10,10,10,10)
输入
第一行一个整数 N。(1 ≤ N ≤ 100)
第二行 N 个整数,A1, A2, …,An。(N堆纸牌,每堆纸牌初始数,1 ≤ Ai ≤ 10000)
输出
输出一个整数表示所有堆均达到相等时的最少移动次数。
样例:
1249 8 17 6
13
参考代码123456789101112131415161718192021222324#include <iostream>using namespace std;int sum;int n, num[105];//牌堆信息int main(){ cin >> n; for (int i = 0; i < n; ++i) { cin >> num[i]; sum += num[i]; } int avg = sum / n; int ans = 0;//需要移动的次数 for (int i = 0; i < n - 1; ++i) { if (num[i] != avg) { ans++; num[i + 1] += num[i] - avg; num[i] = avg; } } cout << ans <<endl; return 0;}
谁拿了最多奖学金
谁拿了最多奖学金
原题链接:http://oj.haizeix.com/problem/381
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
院士奖学金,每人 8000 元,期末平均成绩高于 80 分(>80),并且在本学期内发表 1 篇或 1 篇以上论文的学生均可获得;
五四奖学金,每人 4000 元,期末平均成绩高于 85 分(>85),并且班级评议成绩高于 80 分(>80)的学生均可获得;
成绩优秀奖,每人 2000 元,期末平均成绩高于 90 分(>90)的学生均可获得;
西部奖学金,每人 1000 元,期末平均成绩高于 85 分(>85)的西部省份学生均可获得;
班级贡献奖,每人 850 元,班级评议成绩高于 80 分(>80)的学生干部均可获得;
只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。
现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高。
输入:
第一行是 1 个整数 N(1 ≤ N ≤ 100),表示学生的总数。
接下来的 N 行每行是一位学生的数据,从左向右依次是姓名、期末平均成绩、班级评议成绩、是否是学生干部、是否是西部省份学生、以及发表的论文数。
是否是学生干部和是否是西部省份学生分别用 1 个字符表示,Y 表示是,N 表示不是;发表的论文数是 0 到 10 的整数。
输出:
包括 3 行。
第 1 行是获得最多奖金的学生的姓名。
第 2 行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。
第 3 行是这 N 个学生获得的奖学金的总数。
样例:
123454YaoLin 87 82 Y N 0ChenRuiyi 88 78 N Y 1LiXin 92 88 N N 0ZhangQin 83 87 Y N 1
123ChenRuiyi900028700
思路:
构造student结构体,包含编号num、姓名name、期末平均成绩avg、班级评议成绩cla_avg、学生干部position、西部身份west、论文数量paper、奖学金money
进行学生信息的录入,并通过func()函数计算某个学生的奖学金money
利用sort函 ...
奖学金
奖学金
原题链接:http://oj.haizeix.com/problem/375
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。
期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
输入:
共 n + 1 行。
第 1 行为一个正整数 n(6 ≤ n ≤ 300),表示该校参加评选的学生人数。
第 2 到 n + 1 行,每行有 3 个用空格隔开的数字,每个数字都在 0 到 100 之间。第 j 行的 3 个数字依次表示学号为 j−1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 n − 1(恰好是输入数据的行号减 1)。
输出:
共 5 行,每行是两个用空格隔开的正整数,依次表示前 5 名学生的学号和总分。
样例:
123456789880 89 8988 98 7890 67 8087 66 9178 89 9188 99 7767 89 6478 89 98
123458 2652 2646 2641 2585 258
思路:
构造student自定义类型,包含学生学号num、语文成绩chinese、数学成绩math、英语成绩english、总分all
进行学生信息的录入,并计算学生的总成绩
利用sort函数对student自定义类型按照给定的排序方式进行排序后进行输出
12345678910111213141516171819202122232425262728293031323334353637#include<iostream>#include<algorithm>using namespace std;//1.构造student自定义类型,包含学生所有信息struct student{ int num, chinese, math, english, all;};student stu[305];bool cmp(const student &a, const student &b){ if(a.all == b.all) ...