CSDN编程竞赛 ——— 第六期

CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16

第六期竞赛题目

一、严查枪火

1、题目描述

  X国最近开始严查枪火。像是 “ a k ” “ak” ak “ m 4 a 1 ” “m4a1” m4a1” “ s k r ” “skr” skr都是明令禁止的。 现在小Q查获了一批违禁物品,其中部分是枪支。小Q想知道自己需要按照私藏枪火来关押多少人。 (只有以上三种枪被视为违法)

  • 输入描述: 第一行输入整数 n ( 1 ≤ n ≤ 1000 ) n(1≤n≤1000) n(1n1000)表示携带违禁物品的人数。以下 n n n 行表示违禁物品的名称。
  • 输出描述: 输出需要按照私藏枪火来关押的人。

示例:

输入:3
   Dsd
   ak
   232asd
输出:1

2、代码实现

解题步骤如下:

  1. 依次读取输入的每个字符串,统计读取到的字符串中 “ a k ” “ak” ak “ m 4 a 1 ” “m4a1” m4a1” “ s k r ” “skr” skr的个数并进行输出。

代码如下:

//严查枪火
#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、题目描述

  鬼画符门,每年都会统计自己宗门鬼画符消耗的数量,往年一直是大师兄管理,但是这次鬼艺接手了,你能帮鬼艺写一个程序统计每年消耗数量最多的鬼画符吗?

  • 输入描述: 第一行输入整数 n ( 1 ≤ n ≤ 1000 ) n(1≤n≤1000) n(1n1000),以下 n n n 行输入 n n n 个字符串,代表消耗的鬼画符。
  • 输出描述: 输出消耗数量最多的鬼画符(字符串),无需考虑多种鬼画符消耗数量相同的情况。

示例:

输入:5
   red
   red
   green
   green
   hen
输出:red

2、代码实现

解题步骤如下:

  1. 借助unordered_map容器统计每个鬼画符消耗的数量。
  2. 遍历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、题目描述

  已知字符串 s t r str str s t r str str 表示邮箱的不标准格式。其中 “ . ” “.” “.”会被记录成 “ d o t ” “dot” dot “ @ ” “@” “@”会被记录成 “ a t ” “at” at
  写一个程序将 s t r str str 转换成可用的邮箱格式。(可用格式中字符串中除了开头结尾,所有 “ d o t ” “dot” dot都会被转换, “ a t ” “at” at只会被转换一次,开头结尾的不转换)

  • 输入描述: 输入字符串 s t r ( 1 ≤ s t r l e n ( s t r ) ≤ 1000 ) str(1≤strlen(str)≤1000) str(1strlen(str)1000)
  • 输出描述: 输出转换后的格式。

示例:

输入:mxyatoxcoderdotcom
输出:[email protected]

2、代码实现

解题步骤如下:

  1. 依次遍历所给字符串中的每个字符。
  2. 当遍历到连续的‘d’、‘o’、‘t’字符时,如果‘d’字符不位于字符串开头,并且‘t’字符不位于字符串结尾,则将这三个字符串转换成‘.’。
  3. 当遍历到连续的‘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。

  • 输入描述: 第一行输入整数 n ( 1 ≤ n ≤ 1000 ) n(1≤n≤1000) n(1n1000)表示数组的大小,第二行给出 n n n 个整数 a ( − 1 e 9 ≤ a ≤ 1 e 9 ) a(-1e^9≤a≤1e^9) a(1e9a1e9)
  • 输出描述: 输出数组中最长递增区间的长度。

示例:

输入:6
   5 2 3 8 1 9
输出:3

2、代码实现

解题步骤如下:

  1. 遍历所给数组,遍历的同时用mCount记录下当前最长递增区间的长度,用count记录下当前递增区间的长度。
  2. 当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;
}

猜你喜欢

转载自blog.csdn.net/chenlong_cxy/article/details/127028375
今日推荐