定义在<algorithm>里面 用法:
1 2 3 4 5 |
int a[5] = {0, 3, 9, 4, 5}; int *b; b = max_element(a, a+5); cout << *b; |
定义在<algorithm>里面 用法:
1 2 3 4 5 |
int a[5] = {0, 3, 9, 4, 5}; int *b; b = max_element(a, a+5); cout << *b; |
编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。现给定所有队员的比赛成绩,请你编写程序找出冠军队。
输入格式:
输入第一行给出一个正整数N(<=10000),即所有参赛队员总数。随后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
分析:用team数组保存每个队伍的总得分,输入的时候将成绩score累加到队伍编号t的team[t]中,比较team数组中所有得分,将最大值的下标保存在max中,最后输出最高分的队伍编号max和对应的总得分team[max]~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> using namespace std; int main() { int n, t, num, score; cin >> n; int team[1001] = {0}; for (int i = 1; i <= n; i++) { scanf("%d-%d %d", &t, &num, &score); team[t] += score; } int max = 0; for (int i = 0; i < 1001; i++) { if (team[max] < team[i]) max = i; } cout << max << " " << team[max]; return 0; } |
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。
输入格式:
输入第一行先给出一个正整数N(<=100),随后N行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中“喊”是喊出的数字,“划”是划出的数字,均为不超过100的正整数(两只手一起划)。
输出格式:
在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。
输入样例:
5
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
输出样例:
1 2
分析:jia和yi分别代表甲乙两人喝酒的杯数,sum表示甲喊和乙喊之和,如果sum == 甲划,并且sum != 乙划,表示乙输了,乙喝酒杯数yi++,反之jia++,最后输出jia和yi的值~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <iostream> using namespace std; int main() { int n, jia = 0, yi = 0, jiahan, jiahua, yihan, yihua, sum; cin >> n; for (int i = 0; i < n; i++) { cin >> jiahan >> jiahua >> yihan >> yihua; sum = jiahan + yihan; if (sum == jiahua && sum != yihua) yi++; if (sum != jiahua && sum == yihua) jia++; } cout << jia << " " << yi; return 0; } |
火星人是以13进制计数的:地球人的0被火星人称为tret。地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的12个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。例如地球人的数字“29”翻译成火星文就是“hel mar”;而火星文“elo nov”对应地球数字“115”。为了方便交流,请你编写程序实现地球和火星数字之间的互译。
输入格式:
输入第一行给出一个正整数N(<100),随后N行,每行给出一个[0, 169)区间内的数字 —— 或者是地球文,或者是火星文。
输出格式:
对应输入的每一行,在一行中输出翻译后的另一种语言的数字。
输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13
分析:因为给出的可能是数字(地球文)也有可能是字母(火星文),所以用字符串s保存每一次的输入,因为如果是火星文则会出现空格,所以用getline接收一行的输入~计算string s的长度len,判断s[0]是否是数字,如果是数字,表示是地球文,则需要转为火星文,执行func1();如果不是数字,则说明是火星文,需要转为地球文,执行func2();
func1(int t)中,传入的值是string转int后的结果stoi(s),因为数字最大不超过168,所以最多只会输出两位火星文,如果t / 13不等于0,说明有高位,所以输出b[t/13];如果输出了高位(t/13不等于0)并且t % 13不等于0,说明有高位且有低位,所以此时输出空格;如果t % 13不等于0,说明有低位,此时输出a[t % 13];注意,还有个数字0没有考虑,因为数字0取余13等于0,但是要特别输出tret,所以在func1的最后一句判断中加一句t == 0,并将a[0]位赋值成tret即可解决0的问题~
func2()中,t1和t2一开始都赋值0,s1和s2用来分离火星文单词,因为火星文字符串只可能一个单词或者两个单词,而且一个单词不会超过4,所以先将一个单词的赋值给s1,即s1 = s.substr(0, 3);如果len > 4,就将剩下的一个单词赋值给s2,即s2 = s.substr(4, 3);然后下标j从1到12遍历a和b两个数组,如果a数组中有和s1或者s2相等的,说明低位等于j,则将j赋值给t2;如果b数组中有和s1相等的(b数组不会和s2相等,因为如果有两个单词,s2只可能是低位),说明高位有值,将j赋值给t1,最后输出t1 * 13 + t2即可~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <iostream> #include <string> using namespace std; string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"}; string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"}; string s; int len; void func1(int t) { if (t / 13) cout << b[t / 13]; if ((t / 13) && (t % 13)) cout << " "; if (t % 13 || t == 0) cout << a[t % 13]; } void func2() { int t1 = 0, t2 = 0; string s1 = s.substr(0, 3), s2; if (len > 4) s2 = s.substr(4, 3); for (int j = 1; j <= 12; j++) { if (s1 == a[j] || s2 == a[j]) t2 = j; if (s1 == b[j]) t1 = j; } cout << t1 * 13 + t2; } int main() { int n; cin >> n; getchar(); for (int i = 0; i < n; i++) { getline(cin, s); len = s.length(); if (s[0] >= '0' && s[0] <= '9') func1(stoi(s)); else func2(); cout << endl; } return 0; } |
给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按“PATestPATest….”这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按PATest的顺序打印,直到所有字符都被输出。
输入格式:
输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。
输出格式:
在一行中按题目要求输出排序后的字符串。题目保证输出非空。
输入样例:
redlesPayBestPATTopTeePHPereatitAPPT
输出样例:
PATestPATestPTetPTePePee
分析:将字符串的每一个字符出现的个数保存在int map[128]中,然后依次输出PATest,每次输出一次字符就将map对应的字符个数减1~
PS:感谢@xiaorong61 提供的pull request~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> using namespace std; int main() { int map[128] = {0}, c; while ((c = cin.get()) != EOF) map[c]++; while (map['P'] > 0 || map['A'] > 0 || map['T'] > 0 || map['e'] > 0 || map['s'] > 0 || map['t'] > 0) { if (map['P']-- > 0) cout << 'P'; if (map['A']-- > 0) cout << 'A'; if (map['T']-- > 0) cout << 'T'; if (map['e']-- > 0) cout << 'e'; if (map['s']-- > 0) cout << 's'; if (map['t']-- > 0) cout << 't'; } return 0; } |
请编写程序,找出一段给定文字中出现最频繁的那个英文字母。
输入格式:
输入在一行中给出一个长度不超过1000的字符串。字符串由ASCII码表中任意可见字符及空格组成,至少包含1个英文字母,以回车结束(回车不算在内)。
输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。
输入样例:
This is a simple TEST. There ARE numbers and other symbols 1&2&3………..
输出样例:
e 7
分析:因为统计时不区分大小写,输出小写字母,所以先将string s中所有字符用tolower转为小写~然后遍历字符串s,用islower判断每一个字符是否是字母,如果是字母,就将数组a对应的下标s[i]-‘a’统计加1,接着遍历数组a,将出现次数最高的那个英文字母的数组下标i保存在t中,出现的最多次数保存在max中,最后输出下标t对应的字母t + ‘a’和max的值~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <cctype> #include <string> using namespace std; int main() { string s; getline(cin, s); int a[26] = {0}; for (int i = 0; i < s.length(); i++) s[i] = tolower(s[i]); for (int i = 0; i < s.length(); i++) if (islower(s[i])) a[s[i] - 'a']++; int max = a[0], t = 0; for (int i = 1; i < 26; i++) { if (a[i] > max) { max = a[i]; t = i; } } printf("%c %d", t + 'a', max); return 0; } |