网易互娱游戏研发暑期实习笔试(2020.04.11晚上19:00-21:30)

三道笔试,全是编程。AC了前两道,记录一下。
题目图片来自牛客网
https://www.nowcoder.com/discuss/405887?type=post&order=create&pos=&page=1

1

40米大刀
在这里插入图片描述在这里插入图片描述
思路:把补给品取出来,按距离排序,逐一砍下。multimap容器非常适合本题。下面是AC的代码:

#include <cmath>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
long long func(vector<vector<int> > &table, int l, int x, int y)
{
	multimap<double, int> want;
	for (int i = 0; i < table.size(); ++i)
	{
		for (int j = 0; j < table.size(); ++j)
		{
			if (table[i][j] > 0)
			{
				double dis = sqrt((i - x) * (i - x) + (j - y) * (j - y));
				int value = table[i][j];
				want.insert({dis, value});
			}
		}
	}
	
	long long res = l;
	for (auto it = want.begin(); it != want.end();)
	{
		//cout << it->first << ' ';
		if (it->first - res < 0.00000000000000000001)
		{
			res += it->second;
				
			++it;
		}
		else
			break;
			
	}
	//cout << endl;
	return res;
	//long long res = l;
	
}


int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int m, l, x, y;
		cin >> m >> l;
		vector<vector<int> > table(m, vector<int>(m));
		for (int i = 0; i < m; ++i)
		{
			for (int j = 0; j < m; ++j)
			{
				cin >> table[i][j];
			}
		}
		
		cin >> x >> y;
		cout << func(table, l, x, y) << endl;
	}
	
	return 0;
}

上面代码还可以优化,距离只是用来比较,可以用平方来比较,从而不必开方引入double数据。

2

在这里插入图片描述
思路:用set表示集合,放入vector中表示全部的集合,用map记录每个数所在的集合。下面是AC的代码

#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

int main()
{
	int t;
	while(cin >> t)
	{
		while (t--)
	{
		int n, m;
		cin >> n >> m;
		map<int, int> ma;
		vector<set<int> > vs(n + 1);
		for (int i = 1; i <= n; ++i)
		{
			ma[i] = i;
			vs[i].insert(i);
		}
		
		while (m--)
		{
			int op, x, y;
			cin >> op;
			if (op == 1)
			{
				cin >> x >> y;
				if (ma[x] != ma[y])
				{
					int k = ma[y];
					while (!vs[k].empty())
					{
						int v = *(vs[k].begin());
						vs[k].erase(vs[k].begin());
						vs[ma[x]].insert(v);
						ma[v] = ma[x]; 
					}
				
					//cout << vs[ma[y]].size() << ' ' << vs[ma[x]].size() << endl;
				 } 
			}
			else if (op == 2)
			{
				cin >> x;
				if (vs[ma[x]].size() != 1)
				{
					for (int i = 1; i <= n; ++i)
					{
						if (vs[i].empty())
						{
							//cout << "new place" << endl;
							vs[i].insert(x);
							vs[ma[x]].erase(x);
							ma[x] = i;
							break;
						}
					}
				}
			}
			else
			{
				cin >> x;
				cout << vs[ma[x]].size() << endl;
			}
		}
			
	}
	}
	
	
	return 0;
}

3

在这里插入图片描述
这题没做,可以参考这里的讨论:
https://www.nowcoder.com/discuss/405821?type=post&order=time&pos=&page=3
https://www.nowcoder.com/discuss/405922?type=post&order=time&pos=&page=1

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值