编程竞赛 ——— 第六期
原创
©著作权归作者所有:来自51CTO博客作者2021dragon的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
第六期竞赛题目
一、严查枪火
1、题目描述
,,都是明令禁止的。 现在小Q查获了一批违禁物品,其中部分是枪支。小Q想知道自己需要按照私藏枪火来关押多少人。 (只有以上三种枪被视为违法)
- 输入描述:第一行输入整数表示携带违禁物品的人数。以下
- 输出描述:输出需要按照私藏枪火来关押的人。
示例:
输入:3
Dsd
ak
232asd
输出:1
2、代码实现
解题步骤如下:
- 依次读取输入的每个字符串,统计读取到的字符串中,和的个数并进行输出。
代码如下:
//严查枪火
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n = 0;
cin >> n;
string s;
int count = 0;
for (int i = 0; i < n; i++)
{
cin >> s;
if (s == "ak" || s == "m4a1" || s == "skr")
count++;
}
cout << count << endl;
return 0;
}
二、鬼画符门
1、题目描述
鬼画符门,每年都会统计自己宗门鬼画符消耗的数量,往年一直是大师兄管理,但是这次鬼艺接手了,你能帮鬼艺写一个程序统计每年消耗数量最多的鬼画符吗?
- 输入描述:第一行输入整数,以下行输入
- 输出描述:输出消耗数量最多的鬼画符(字符串),无需考虑多种鬼画符消耗数量相同的情况。
示例:
输入:5
red
red
green
green
hen
输出:red
2、代码实现
解题步骤如下:
- 借助unordered_map容器统计每个鬼画符消耗的数量。
- 遍历unordered_map容器,找出消耗数量最多的鬼画符。
代码如下:
//鬼画符门
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
int n = 0;
cin >> n;
//统计每个鬼画符消耗的数量
unordered_map<string, int> um;
string s;
for (int i = 0; i < n; i++)
{
cin >> s;
um[s]++;
}
//找出消耗数量最多的鬼画符
int mCount = 0;
string ret;
for (auto e : um)
{
if (e.second > mCount)
{
mCount = e.second;
ret = e.first;
}
}
cout << ret << endl;
return 0;
}
三、收邮件箱
1、题目描述
, 表示邮箱的不标准格式。其中会被记录成,会被记录成。
写一个程序将 转换成可用的邮箱格式。(可用格式中字符串中除了开头结尾,所有都会被转换,只会被转换一次,开头结尾的不转换)
- 输入描述:输入字符串。
- 输出描述:输出转换后的格式。
示例:
输入:mxyatoxcoderdotcom
输出:mxy@oxcoder.com
2、代码实现
解题步骤如下:
- 依次遍历所给字符串中的每个字符。
- 当遍历到连续的‘d’、‘o’、‘t’字符时,如果‘d’字符不位于字符串开头,并且‘t’字符不位于字符串结尾,则将这三个字符串转换成‘.’。
- 当遍历到连续的‘a’、‘t’字符时,如果‘a’字符不位于字符串开头,并且‘t’字符不位于字符串结尾,并且之前没有转换过‘at’,则将这两个字符串转换成‘@’。
代码如下:
//收邮件箱
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cin >> str;
string ret;
size_t pos = 0;
bool flag = false;
while (pos < str.size())
{
if ((pos != 0) && (pos + 2 != str.size() - 1) &&
(str[pos] == 'd') && (pos + 1 < str.size() && str[pos + 1] == 'o') && (pos + 2 < str.size() && str[pos + 2] == 't'))
{
ret += '.';
pos += 3;
}
else if ((flag == false) && (pos != 0) && (pos + 1 != str.size() - 1) &&
(str[pos] == 'a') &&(pos + 1 < str.size() && str[pos + 1] == 't'))
{
ret += '@';
pos += 2;
flag = true;
}
else
{
ret += str[pos];
pos++;
}
}
cout << ret << endl;
return 0;
}
四、最长递增的区间长度
1、题目描述
给一个无序数组,求最长递增的区间长度,如:[5, 2, 3, 8, 1, 9],最长区间2, 3, 8长度为3。
- 输入描述:第一行输入整数表示数组的大小,第二行给出个整数。
- 输出描述:输出数组中最长递增区间的长度。
示例:
输入:6
5 2 3 8 1 9
输出:3
2、代码实现
解题步骤如下:
- 遍历所给数组,遍历的同时用mCount记录下当前最长递增区间的长度,用count记录下当前递增区间的长度。
- 当count的值超过mCount的值时则对mCount的值进行更新,当遍历到的数字小于前一个数字时则将count的值清0。
代码如下:
//最长递增的区间长度
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
//读取数组
vector<int> v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
//找出最长递增区间的长度
int mCount = 0;
int count = 0;
for (int i = 1; i < n; i++)
{
if (v[i] - v[i - 1] > 0)
{
count++;
if (count > mCount)
mCount = count;
}
else
{
count = 0;
}
}
cout << mCount + 1 << endl;
return 0;
}