//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 的矩阵,矩阵中的元素为0或1。如果矩阵中有若干个 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) 回帖