美团9.27 三四五题

由于当时第五题比较赶 直接在考试ide做了,没有保存,所以第五题是回忆版的,可能有些细节的遗漏,有哪位哥给我看下第五题的题目截图。具体题解有空更新。
//第三题dp
int main() {
	int n;
	cin >> n;
	string s;
	getline(cin, s);
	getline(cin, s);
	int e = -1;
	int l = s.size();
	vector<int> v(l, 0);
	int re = 0;
	if (s[0] == 'E'){v[0] = 1; e = 0;
}
    else v[0] = -1;
	for (int i = 1; i < l; i++) {
		if (s[i] == 'E') {
			if (e != -1) {
				v[i] = max(1, v[e] + 1 - (i - e-1));
				e = i;

			}
			else {
				v[i] = 1; e = i;
			}
			re = max(re, v[i]);
		}
		else {
			if (e != -1) {
				v[i] = max(-1, v[e]-1 - (i - e - 1));

			}
			else {
				v[i] = -1;
			}
			re = max(re, v[i]);
		}
	}
	cout << re;
}

//第四题bfs
int main() {
	int n, m, x1, y1, x2, y2;
	cin >> n >> m >> x1>>y1>>x2>>y2;
	x1 -= 1; y1 -= 1; x2 -= 1; y2 -= 1;
	vector<vector<int>> v(n, vector<int>(m, 0));
	vector<vector<int>> vv(n, vector<int>(m, 0));
	for (int i = 0; i < n; i++) {
		for (int ii = 0; ii < m; ii++) {
			cin >> v[i][ii];
		}
	}
	for (int i = 0; i < n; i++) {
		for (int ii = 0; ii < m; ii++) {
			cin >> vv[i][ii];
		}
	}
	vector<vector<int>> sig(n, vector<int>(m, 0));
	int re = 0;
	sig[x1][y1] = 1;
	queue < vector<int>> q;
	q.push({ x1,y1,0 });
	sig[x1][y1] = 1;
	while (!q.empty()) {
		auto k = q.front();
		q.pop();
		int x = k[0], y = k[1], res = k[2];
		if (x == x2 && y == y2) {
			cout << res;
			break;
		}
		if (x < 0 || y < 0 || x >= n || y >= m) continue;
		int a = v[x][y], b = vv[x][y];
		int sum = a + b;
		if (res%sum < a) {
			if (x + 1 < n && !sig[x + 1][y])
			{
				q.push({ x + 1,y,res + 1 }); sig[x + 1][y] = 1;
			}
			if (x - 1 >= 0 && !sig[x - 1][y])
			{
				q.push({ x - 1,y,res + 1 }); sig[x - 1][y] = 1;
			}

		}
		else {
			if (y + 1 < m && !sig[x][y + 1])
			{
				q.push({ x,y + 1,res + 1 }); sig[x][y + 1] = 1;
			}
				if (y - 1 >= 0 && !sig[x][y - 1])
				{
					q.push({ x,y - 1,res + 1 }); sig[x][y - 1] = 1;
				}

		}
		q.push({ x,y,res + 1 });
	}

}

//第五题最小生成树思想下的数位dp
int main() {
	int m;
	cin >> m;
	for (int i = 0; i < m; i++) {
		int n;
		cin >> n;
		vector<vector<int>> vv(n, vector<int>(n, 0));
		for (int i = 0; i < n; i++) {
			for (int ii = 0; ii < n; ii++) {
				cin >> vv[i][ii];
			}
		}
		int l = 1 << n;
		int re = INT_MAX / 2;
		vector<vector<int>> v(n, vector<int>(l, INT_MAX / 2));
		for (int i = 0; i < n; i++) v[i][0] = 0;
		for (int i = 1; i < l; i++) {
			for (int j = 0; j < n; j++) {
				if (((i >> j) & 1) == 0) {
					for (int k = 0; k < n; k++) {
						if (((i >> k) & 1) == 1)
							v[j][i] = min(v[j][i], vv[j][k] + v[k][i ^ (1 << k)]);
					}
					if ((i | (1 << j)) == l - 1) re = min(v[j][i], (int)re);
				}
			}
		}
		cout << re<<endl;
	}
}


#美团##笔试题型#
全部评论

相关推荐

4 1 评论
分享
牛客网
牛客企业服务