网易互娱:笔试题(20190907)

本文介绍了两种算法挑战题的解决方案,一是通过使用栈和向量来判断一个数的二进制表示是否为回文数;二是通过构建二叉树并进行层次遍历来判断其是否为递增树。此外,还探讨了如何计算在特定条件下一个月内喝咖啡的总次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二进制回文数

利用栈stack作为媒介来求十进制数的二进制,再折半比较判断是否为回文数。

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

bool sample(int num)
{
	stack<int> values;
	while(num)
	{
		values.push(num%2);
		num = num / 2;
	}

	vector<int> container;
	while(!values.empty())
	{
		int cur = values.top();
		container.push_back(cur);
		values.pop();
	}

	int cl = container.size();
	for(int ci=0; ci < cl/2; ci++)
	{
		if(container[ci] == container[cl-ci-1])
			continue;
		else
			return false;
	}
	return true;
}


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

	for(int tu=0; tu < t; tu++)
	{
		int num;
		cin >> num;
		
		int res = sample(num);

		if(res)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}

	return 0;
}

递增树

由于给定了格式当前结点的编号:结点值、左结点的编号、右结点的编号,所以采用字典来存储这样的一个类似于三元组的二叉树。在判断是否为递增二叉树之前,要根据字典values找出根节点,再利用队列deque结构来进行层次遍历。

#include <iostream>
#include <vector>
#include <map>
#include <deque>
#include <set>

using namespace std;

bool sample(int n, map<int, vector<int>> values)
{
	if(n==1)
		return true;

	vector<int> bt;
	for(int nu=0; nu < n; nu++)
		bt.push_back(nu);

	for(int nu=0; nu<n; nu++)
	{
		vector<int> current = values[nu];

		int left=current[1], right=current[2];
		if(left!=-1)
			bt[left] = -1;
		if(right!=-1)
			bt[right] = -1;
	}

	int first=-1;
	for(int nu=0; nu<n; nu++)
	{
		if(bt[nu] != -1)
		{
			first = nu;
			break;
		}
	}

	if(first == -1)
		return false;


	deque<vector<int>> container;
	container.push_back(vector<int>(1, first));
	int layer = -1;
	while(!container.empty())
	{
		vector<int> vu = container.front();
		container.pop_front();
		int node_values = 0;
		vector<int> nxt;
		for(int si=0; si<int(vu.size()); si++)
		{
			int su = vu[si];
			node_values += values[su][0];
			if(values[su][1]!=-1)
				nxt.push_back(values[su][1]);
			if(values[su][2]!=-1)
				nxt.push_back(values[su][2]);
		}
		if(!nxt.empty())
			container.push_back(nxt);
		if(layer<node_values)
		{
			layer = node_values;
			// cout << node_values << endl;
		}
		else
			return false;
	}
	return true;
}


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

	for(int tu=0; tu<t; tu++)
	{
		int n;
		cin >> n;

		map<int, vector<int>> values;
		for(int nu=0; nu<n; nu++)
		{
			vector<int> value(3);
			for(int i=0; i<3; i++)
			{
				cin >> value[i];
			}
			values.insert(pair<int, vector<int>>(nu, value));
		}

		int res = sample(n, values);

		if(res)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}

	return 0;
}

喝咖啡

要格外注意边界处理,比如固定天数m为0的情况,不是简单的除以(k+1),而是遍历一趟所能累加的次数。一般情况下,则是分别对left、right进行扫描,对固定天数m的两个元素值之间进行判断。

#include <iostream>
#include <vector>

using namespace std;

int coffee(int k, int m, vector<int> days)
{
	if(k==0)
		return 30;
	if(m==0)
	{
		int res = 1, val = 1;
		while(val < 31)
		{
			if(val+(k+1) < 31)
				res += 1;
			val += (k+1);
		}
		return res;
	}

	int res = m;

	int left = days[0];
	while(left>0)
	{
		if(left-k-1 > 0)
			res += 1;
		left -= (k+1);
	}

	int right = days[m-1];
	while(right < 31)
	{
		if(right+k+1 < 31)
			res += 1;
		right += (k+1);
	}

	if(m==1)
		return res;

	for(int di=0; di < days.size()-1; di++)
	{
		int cur=days[di], nxt=days[di+1];

		int gap = nxt - cur - 1;
		int mid = (gap-(2*k+1))/(k+1) +1;
		if(gap-(2*k+1)>= 0 && mid>=0)
			res += mid;
	}
	return res;
}


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

	for(int tu=0; tu<t; tu++)
	{
		int k, m;
		cin >> k >> m;

		vector<int> days(m);
		for(int mu=0; mu<m; mu++)
		{
			cin >> days[mu];
		}

		int res = coffee(k, m, days);
		cout << res << endl;
	}

	return 0;
}

印章

题目内容有点冗杂,就直接放弃了。

(最近更新:2019年09月07日)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值