网易笔试解析

第一题:签到
第二题:很多情况需要考虑
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[10];
char b[10];
int main()
{
	int t;
	cin >> t ;
	while(t --){
		int n;
		cin >> n;
		for(int i = 1; i <= n; i ++)	cin >> a[i];
		for(int i = 1; i <= n; i ++)	cin >> b[i];
		sort(a + 1, a + n + 1);
		sort(b + 1, b + n + 1);
		pair<int,int>	cnt0[10];
		for(int i = 0; i < 10; i ++)	cnt0[i] = {0, 0};
		int ct0 = 0, ct1 = 0;
		for(int i = 1; i <= n; i ++){
			if(ct0 && cnt0[ct0].first == a[i]){
				cnt0[ct0].second ++;
			} else{
				cnt0[++ct0] = {a[i], 1};
			}
		}
		pair<char,int>	cnt1[10];
		for(int i = 0; i < 10; i ++)	cnt1[i] = {0, 0};
		for(int i = 1; i <= n; i ++){
			if(ct1 && cnt1[ct1].first == b[i]){
				cnt1[ct1].second ++;
			} else{
				cnt1[++ct1] = {b[i], 1};
			}
		}

		if(n == 1)	puts("1");
		else if(n == 2){
			if(ct0 == 1)	puts("2");
			else	puts("1");
		} else if(n == 3){
			if(ct0 == 1)	puts("6");
			else if(ct0 == 2)	puts("2");
			else	puts("1");
		} else if(n == 4){
			if(ct0 == 1)	puts("150");
			else if(ct0 == 2 && (cnt0[1].second == 1 || cnt0[1].second == 3))	puts("6");
			else if(ct0 == 2 && cnt0[1].second == 2)	puts("4");
			else if(ct0 == 3)	puts("2");
			else	puts("1");
		} else if(n == 5){
			if(ct0 == 1)	puts("15000");
			else if(ct1 == 1 && ct0 == 5 && cnt0[1].first + 4 == cnt0[5].first)	puts("8000");
			else if(ct1 == 1)	puts("300");
			else if(ct0 == 2 && (cnt0[1].second == 1 || cnt0[1].second == 4))	puts("150");
			else if(ct0 == 2 && (cnt0[1].second == 2 || cnt0[1].second == 3))	puts("40");
			else if(ct0 == 5 && cnt0[1].first + 4 == cnt0[5].first)	puts("20");
			else if(ct0 == 3 && (cnt0[1].second == 3 || cnt0[2].second == 3 || cnt0[3].second == 3))puts("6");
			else if(ct0 == 3 && (cnt0[1].second == 1 || cnt0[2].second == 1 || cnt0[3].second == 1))puts("4");
			else if(ct0 == 4)	puts("2");
			else	puts("1");
		}
	}
}
第三题:不记得了。。。
第四题:枚举时间,如果当前区域大于等于这个时间就加标记,然后每次加的标记进行并查集。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 800;
int a[N][N];
int p[N * N + N];
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
bool st[N][N];
int n, m;
bool ttmp(pair<int,int> a, pair<int,int> b)
{
	return a.first > b.first;
}
int find(int x)
{
	if(p[x] == x)	return x;
	return p[x] = find(p[x]);
}
void dfs(int x, int y)
{
	int tt = m * (x - 1) + y;
	for(int i = 0; i < 4; i ++){
		int nx = x + dx[i], ny = y + dy[i];
		int tmp = m * (nx - 1) + ny;
		if(st[nx][ny] && find(tt) != find(tmp)){
			p[find(tt)] = find(tmp);
		}
	}
}
int main()
{
	cin >> n >> m;
	int myx, myy;
	cin >> myx >> myy;
	int posx, posy;
	cin >> posx >> posy;
	memset(st, false, sizeof st);
	int mx = -1;
	vector<pair<int,int>> res;
	for(int i = 1; i <= n; i ++){
		for(int j = 1; j <= m; j ++){
			scanf("%d", &a[i][j]);
			mx = max(mx, a[i][j]);
			res.push_back({a[i][j], m * (i - 1) + j});
		}
	}
	sort(res.begin(), res.end(), ttmp);
	for(int i = 1; i <= N * N; i ++){
		p[i] = i;
	}
	for(int k = 0; k <= mx + 1; k ++){
		vector<pair<int,int>> v;
		int tmp = res.size();
		for(int i = tmp - 1; i >= 0; i --){
			int x = res[i].first, y = res[i].second;
			if(x <= k){
				int ii = y / m + 1, jj = y % m;
				if(jj == 0)	jj = m;
				st[ii][jj] = 1;
				v.push_back({ii, jj});
				res.pop_back();
			}else	break;
		}
		for(int i = 0; i < v.size(); i ++){
			int x = v[i].first, y = v[i].second;
			dfs(x, y);
		}
		if(find(m * (myx - 1) + myy) == find(m * (posx - 1) + posy)){
			cout << k << endl;
			return 0;
		}
	}
	return 0;
}




#面试复盘##笔试题目##网易#
全部评论
感谢分享!
点赞 回复 分享
发布于 2022-03-29 21:20

相关推荐

点赞 评论 收藏
分享
1 4 评论
分享
牛客网
牛客企业服务