首页 > 2020/9/1 19:00拼多多笔试
头像
Ember_Sky
编辑于 2020-09-01 21:46
+ 关注

2020/9/1 19:00拼多多笔试

//1.


给定一个n,输出n*n的矩阵,数字按照上面的划分,分界线上的为0



100%代码

using namespace std;

typedef long long ll;

int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);
	int n; cin >> n;
	vector<vector<int> >s(n, vector<int>(n, 0));


	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i > (n - 1) / 2) {
				if (j > (n - 1) / 2) {
					if (i > j) {
						s[i][j] = 6;
					}
					if (j > i) {
						s[i][j] = 7;
					}
				}
				else if (j < n / 2) {
					if (i + j < n - 1) {
						s[i][j] = 4;
					}
					if (i + j > n - 1) {
						s[i][j] = 5;
					}
				}
			}
			else if (i < n / 2) {
				if (j > (n - 1) / 2) {
					if (i + j < n - 1) {
						s[i][j] = 1;
					}
					if (i + j > n - 1) {
						s[i][j] = 8;
					}
				}
				else if (j < n / 2) {
					if (i > j) {
						s[i][j] = 3;
					}
					if (j > i) {
						s[i][j] = 2;
					}
				}
			}
			cout << s[i][j] << ' ';
		}
		cout << endl;
	}
	return 0;
}


//2.

给出一个 m * n 的矩阵,矩阵中的元素为01。如果矩阵中有若干个 1是相邻(上下左右是挨着)的,那么称这些1构成了一个。现在可以将其中一个元素1移动到任意一个元素为0的位置,问移动之后,形成的块最大的面积。


50%代码

using namespace std;

typedef long long ll;

int n, m;
int num;
set<int>sum0;

void dfs(vector<vector<int>>& s, int i, int j) {
	if (i < 0 || j < 0 || i >= n || j >= m) return;
	if (s[i][j] == 0) return;
	s[i][j] = 0;
	num++;
	dfs(s, i - 1, j);
	dfs(s, i, j - 1);
	dfs(s, i + 1, j);
	dfs(s, i, j + 1);
}
bool vis(const vector<vector<int>>& s, int i, int j) {
	if (i - 1 >= 0) {
		if (s[i - 1][j]) return false;
	}
	if (j - 1 >= 0) {
		if (s[i][j - 1]) return false;
	}
	if (i + 1 < n) {
		if (s[i + 1][j]) return false;
	}
	if (j + 1 < m) {
		if (s[i][j + 1]) return false;
	}
	return true;
}

int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);

	cin >> n >> m;
	vector<vector<int>>s(n, vector<int>(m));
	queue<pair<int, int> >que;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> s[i][j];
			if (s[i][j] == 0) {
				que.push({ i,j });
			}
		}
	}

	int ans = 0;
	while (que.size()) {
		int a = que.front().first;
		int b = que.front().second;
		que.pop();
		if (vis(s, a, b))continue;

		auto t = s;
		t[a][b] = 1;

		set<int>sum1;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				num = 0;
				dfs(t, i, j);
				if (num) sum1.emplace(num);
			}
		}
		if (sum1.empty()) continue;
		int number = *sum1.rbegin();
		if (sum1.size() == 1) {
			number--;
		}
		ans = max(ans, number);
	}
	cout << ans << endl;
	return 0;
}



//3.

01背包,但是体积和重量都可能是负数

64%代码
using namespace std;

typedef long long ll;

int f[210][5010];
int v[210];
int w[210];
int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);

	int m, n; cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= m; j++) {
			f[i][j] = f[i - 1][j];
			if (j >= v[i]) {
				f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
			}
		}
	}
	cout << f[n][m] << endl;
	return 0;
}



//4.

集合1~~N中能被集合B中任意一个元素整除的数量



100%代码



using namespace std;

typedef long long ll;

int gcd(int x, int y) {
	if (x > y) swap(x, y);
	while (1) {
		int a = x;
		int b = y % x;
		if (b == 0) return x;
		x = min(a, b);
		y = max(a, b);
	}
}

int main() {
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);

	int m, n; cin >> n >> m;
	vector<int>s;
	for (int i = 0; i < m; i++) {
		int t; cin >> t;
		s.emplace_back(t);
		for (int j = 0; j < s.size() - 1; j++) {
			if (t % s[j] == 0) {
				s.pop_back();
				break;
			}
		}
	}
	int len = 1;
	for (auto x : s) {
		len = x * len / gcd(x, len);
	}
	int num = 0;
	vector<int>vis(len + 10, 0);
	for (auto x : s) {
		for (int i = x; i <= len; i+=x) {
			if (vis[i] == 0) {
				vis[i] = 1;
				num++;
			}
		}
	}
	int ans = n / len * num;
	int t = n / len * len+1;
	for (int i =t; i <= n; i++) {
		for (auto x : s) {
			if (i % x == 0) {
				ans++;
				break;
			}
		}
	}
	cout << ans << endl;
	return 0;
}


全部评论

(2) 回帖
加载中...
话题 回帖