【华为OD:C++机试】Day-2

目录

1. VLAN 资源池:

2. 根据某条件聚类最少交换次数:

3. 数组合并:

4. 分糖果:

5. 数组组成的最小数字:

6. 矩形相交的面积:

7. 洞穴探险:

8. 非严格递增连续数字序列:

9. 找终点:

10. 路灯照明:



【华为OD:C++机试】Day-2_第1张图片

1. VLAN 资源池:

题目描述:

【华为OD:C++机试】Day-2_第2张图片

【华为OD:C++机试】Day-2_第3张图片

【华为OD:C++机试】Day-2_第4张图片

【华为OD:C++机试】Day-2_第5张图片

code: 

// VLAN资源池
#include 
#include 
#include 
#include 

using namespace std;

vector exchange(const string& str)
{
    // 将字符串转化为:单个数字/数字-数字的形式
    string s = str;
    vector v;
    int pos = 0;
    while ((pos = s.find(',')) != string::npos)
    {
        v.push_back(s.substr(0, pos));
        s = s.substr(pos + 1);
    }
    v.push_back(s);

    // 将数组v转化为:单个数字进行存储
    vector ans;
    for (int i = 0; i < v.size(); i++)
    {
        int pos = 0;
        if ((pos = v[i].find('-')) != string::npos)
        {
            int a = stoi(v[i].substr(0, pos));
            int b = stoi(v[i].substr(pos + 1));
            for (int i = a; i <= b; i++)
            {
                ans.push_back(i);
            }
        }
        else
        {
            ans.push_back(stoi(v[i]));
        }
    }

    return ans;
}

void eraseId(vector& ans, int n)
{
    sort(ans.begin(), ans.end());

    // 找出在数组ans中:第一个大于等于n的位置
    auto it = lower_bound(ans.begin(), ans.end(), n);
    if (it != ans.end() && *it == n)
        ans.erase(it);
}

string exchangeToString(const vector& ans)
{
    string s = to_string(ans[0]);
    for (int i = 1; i < ans.size(); i++)
    {
        if (i < ans.size() && ans[i - 1] + 1 == ans[i])
        {
            s += '-';
            while (i < ans.size() && ans[i - 1] + 1 == ans[i])
            {
                i++;
            }
            s += to_string(ans[i - 1]);
        }
        if (i < ans.size())
        {
            s += ',';
            s += to_string(ans[i]);
        }
    }
    return s;
}

int main()
{
    // 用于保存输入的数据
    string str;
    int n;
    cin >> str >> n;

    // 将输入的数据转换为数字形式进行存储
    vector ans = exchange(str);

     eraseId(ans, n);

    string s = exchangeToString(ans);

    cout << s << endl;

    return 0;
}
2. 根据某条件聚类最少交换次数:

题目描述:

【华为OD:C++机试】Day-2_第6张图片

【华为OD:C++机试】Day-2_第7张图片

【华为OD:C++机试】Day-2_第8张图片

code: 

// 最少交换次数
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	// 用于读取输入的数据
	string line;
	int n;
	getline(cin, line);
	cin >> n;

	// 将读取的数据存放至数组:nums中
	vector nums;
	int num;
	stringstream ss(line);
	while (ss >> num)
	{
		nums.push_back(num);
	}

	// 用flag数组存放:将小于n的位置置为1,大于n的位置置为0
	vector flag;
	for (const auto& e : nums)
	{
		if (e < n)
			flag.push_back(1);
		else
			flag.push_back(0);
	}

	// 将小于n的1的位置相加
	int m = 0;
	for (const auto& e : flag)
		m += e;

	vector dp(nums.size());
	for (int i = 0; i < nums.size(); i++)
	{
		for (int j = i; j < nums.size() && j < i + m; j++)
		{
			dp[i] += flag[j];
		}
	}

	int result = m - *max_element(dp.begin(), dp.end());

	cout << result << endl;

	return 0;
}
3. 数组合并:

题目描述:

【华为OD:C++机试】Day-2_第9张图片

【华为OD:C++机试】Day-2_第10张图片

code: 

// 数组合并
#include 
#include 
#include 
#include 
#include 

using namespace std;

string solveMethod(int k, int n, const vector& lines)
{
	// 用于保存单个数据
	vector> lists;
	for (int i = 0; i < n; i++)
	{
		list list;
		stringstream ss(lines[i]);
		string s;
		while (getline(ss, s, ','))
		{
			list.push_back(stoi(s));
		}
		lists.push_back(list);
	}

	// 将数组进行合并
	int index = 0;
	string ret;
	while (lists.size() > 0)
	{
		for (int i = 0; i < k; i++)
		{
			if (lists[index].empty())
			{
				lists.erase(lists.begin() + index);
				index--;
				break;
			}
			ret += to_string(lists[index].front());
			ret += ',';
			lists[index].pop_front();
		}
		index ++;
		if (index >= lists.size())
			index = 0;
	}
	return ret;
}

int main()
{
	// 用于保存输入的数据
	int k, n;
	cin >> k >> n;
	vector lines(n);
	for (int i = 0; i < n; i++)
	{
		cin >> lines[i];
	}

	// 用于保存输出的数据
	string result = solveMethod(k, n, lines);

	cout << result << endl;

	return 0;
}
4. 分糖果:

题目描述:

【华为OD:C++机试】Day-2_第11张图片

【华为OD:C++机试】Day-2_第12张图片

code: 

// 分糖果
#include 

using namespace std;

int main()
{
	int n;
	cin >> n;

	int count = 0;
	for (int i = n; i != 1; i /= 2, count++)
	{
		if (i == 3)
		{
			count += 2;
			break;
		}
		if (i % 2 != 0)
		{
			if ((i + 1) / 2 % 2 == 0)
				i++;
			else
				i--;
			count++;
		}
	}

	cout << count << endl;

	return 0;
}
5. 数组组成的最小数字:

题目描述:

【华为OD:C++机试】Day-2_第13张图片

【华为OD:C++机试】Day-2_第14张图片

【华为OD:C++机试】Day-2_第15张图片

code: 

// 数组组成的最小数字
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	// 用于保存读入的数据
	string read;
	cin >> read;

	// 用于将读入的数据保存在数组中
	vector save;
	stringstream ss(read);
	string single;
	while (getline(ss, single, ','))
	{
		save.push_back(stoi(single));
	}

	string output;
	int len = save.size();
	if (len == 1)
		output += save[0];
	else
	{
		sort(save.begin(), save.end());
		vector media;
		int realLen = (len == 2) ? 2 : 3;
		for (int i = 0; i < realLen; i++)
		{
			media.push_back(to_string(save[i]));
		}
		sort(media.begin(), media.end());
		for (const auto& s : media)
		{
			output += s;
		}
	}

	cout << output << endl;

	return 0;
}
6. 矩形相交的面积:

题目描述:

【华为OD:C++机试】Day-2_第16张图片

【华为OD:C++机试】Day-2_第17张图片

code: 

// 矩形相交的面积
#include 
#include 
#include 
#include 

using namespace std;

struct Point
{
	int x1;
	int y1;
	int x2;
	int y2;

	Point(int x1, int y1, int x2, int y2)
		:x1(x1), y1(y1), x2(x2), y2(y2)
	{}
};

int min(const vector& v)
{
	int min = INT_MAX;
	for (const auto& e : v)
	{
		if (e < min)
			min = e;
	}
	return min;
}

int max(const vector& v)
{
	int max = INT_MIN;
	for (const auto& e : v)
	{
		if (e > max)
			max = e;
	}
	return max;
}

int main()
{
	vector points;
	for (int i = 0; i < 3; i++)
	{
		int x1, y1, w, h;
		cin >> x1 >> y1 >> w >> h;
		int x2 = x1 + w;
		int y2 = y1 - h;
		points.push_back(Point(x1, y1, x2, y2));
	}

	vector xs, ys;
	for (const auto& e : points)
	{
		xs.push_back(e.x1);
		xs.push_back(e.x2);
		ys.push_back(e.y1);
		ys.push_back(e.y2);
	}

	int min_x = min(xs);
	int max_x = max(xs);
	int min_y = min(ys);
	int max_y = max(ys);

	vector> dp(max_x - min_x + 1, vector(max_y - min_y + 1, 0));

	for (const auto& p : points)
	{
		int x1 = p.x1 - min_x;
		int x2 = p.x2 - min_x;
		int y1 = p.y1 - min_y;
		int y2 = p.y2 - min_y;
		for (int i = min(x1, x2); i < max(x1, x2); i++)
		{
			for (int j = min(y1, y2); j < max(y1, y2); j++)
			{
				dp[i][j]++;
			}
		}
	}

	int ret = 0;
	for (const auto& row : dp)
	{
		for (const auto& e : row)
		{
			if (e == 3)
				ret++;
		}
	}

	cout << ret << endl;

	return 0;
}
7. 洞穴探险:

题目描述:

【华为OD:C++机试】Day-2_第18张图片

【华为OD:C++机试】Day-2_第19张图片

【华为OD:C++机试】Day-2_第20张图片

code: 

// 洞穴探险
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
	string str;
	cin >> str;

	int index = 0, len = 0, max = 0, x = 0, y = 0, l = 0, r = 0;
	while (true)
	{
		str = str.substr(index);
		l = str.find('(');
		r = str.find(')');

		if (l == -1)
			break;

		string substr = str.substr(l + 1, r - l - 1);
		stringstream ss(substr);
		vector nums;
		string s;
		while (getline(ss, s, ','))
		{
			nums.push_back(s);
		}

		if (nums[0].find('0') != 0 && nums[1].find('0') != 0)
		{
			int a = stoi(nums[0]);
			int b = stoi(nums[1]);
			len = a * a + b * b;
			if (len > max)
			{
				max = len;
				x = a;
				y = b;
			}
		}
		index = r + 1;
	}

	cout << '(' << x << ',' << y << ')' << endl;

	return 0;
}
8. 非严格递增连续数字序列:

题目描述:

【华为OD:C++机试】Day-2_第21张图片

【华为OD:C++机试】Day-2_第22张图片

code: 

// 非严格递增连续数字序列
#include 
#include 

using namespace std;

int solveMethod(const string& str)
{
	int curLen = 0, maxLen = 0;

	// 只是用于记录当前字符的上一字符,没有特定的赋值
	char past = 'a';

	for (const char cur : str)
	{
		if (cur >= '0' && cur <= '9')
		{
			if (curLen == 0 || cur >= past)
				curLen++;
			else
			{
				if (curLen > maxLen)
				{
					maxLen = curLen;
				}
				curLen = 1;
			}
			past = cur;
		}
		else
		{
			if (curLen > maxLen)
			{
				maxLen = curLen;
			}
			curLen = 0;
			past = 'a';
		}
	}

	maxLen = max(curLen, maxLen);

	return maxLen;
}

int main()
{
	string str;
	cin >> str;

	int count = solveMethod(str);

	cout << count << endl;

	return 0;
}
9. 找终点:

题目描述:

【华为OD:C++机试】Day-2_第23张图片

【华为OD:C++机试】Day-2_第24张图片

【华为OD:C++机试】Day-2_第25张图片

code: 

// 找终点
#include 
#include 
#include 
#include 
#include 

using namespace std;

vector exchange(const string& str)
{
	stringstream ss(str);
	string s;
	vector save;
	while (getline(ss, s, ' '))
	{
		save.push_back(stoi(s));
	}
	return save;
}

int minStep(const vector& save)
{
	int min_i = 1;
	int max_i = save.size() / 2;
	int current = 0;
	int target = save.size() - 1;
	int minVal = INT_MAX;
	int count = 0;

	for (int i = min_i; i < max_i; i++)
	{
		current = i;
		count++;

		while (current < target)
		{
			current += save[current];
			count++;
		}

		if (current == target)
		{
			minVal = min(minVal, count);
			count = 0;
			continue;
		}

		if (current > target)
		{
			count = 0;
			continue;
		}
	}

	if (minVal <= save.size())
		return minVal;
	else
		return -1;
}

int main()
{
	// 用于保存读入的数据
	string read;
	getline(cin, read);

	// 将读入的数据以数组的形式存储
	vector save = exchange(read);

	// 输出最小的步数
	int count = minStep(save);

	cout << count << endl;

	return 0;
}
10. 路灯照明:

题目描述:

【华为OD:C++机试】Day-2_第26张图片

【华为OD:C++机试】Day-2_第27张图片

code: 

// 路灯照明
#include 
#include 

using namespace std;

void solveMethod(const vector& save)
{
	vector bytes((save.size() - 1) * 100, 0);

	for (int i = 0; i < save.size(); i++)
	{
		int left = max(0, i * 100 - save[i]);
		int right = min((int)bytes.size(), i * 100 + save[i]);
		for (int k = left; k < right; k++)
		{
			bytes[k] = 1;
		}
	}

	int count = 0;
	for (const auto& e : bytes)
	{
		if (e == 0)
			count++;
	}
	cout << count << endl;
}

int main()
{
	int n;
	cin >> n;

	vector save(n);
	for (auto& e : save)
		cin >> e;

	solveMethod(save);

	return 0;
}

坚持打卡!

你可能感兴趣的:(OD机试,c++,算法,开发语言)