日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

第十二届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组

發(fā)布時(shí)間:2025/3/19 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十二届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

試題A :取余

1

試題 B: 雙階乘

// 59375 #include <iostream> using namespace std;const int mod = 100000;int main() {int n = 2021;int res = 1;for (int i = 1; i <= 2021; i += 2) {res = (res * i) % mod;}cout << res; }

試題 C: 格點(diǎn)

// 15698 #include <iostream> using namespace std;int main() {int cnt = 0;for (int i = 1; i <= 2021; ++ i) {for (int j = 1; j <= 2021; ++ j) {if (i * j == 2021)cnt ++ ;}}cout << cnt; }

試題 D: 整數(shù)分解

  • dp
  • f[i][j]f[i][j]f[i][j]表示用i個(gè)數(shù)相加表示數(shù)字j的方案數(shù)
// 691677274345 #include <iostream> #include <cstring> using namespace std;typedef long long ll;ll f[10][2030];int main() {f[0][0] = 1;for (int i = 1; i <= 5; ++ i) {for (int j = 1; j <= 2021; ++ j) {for (int k = 1; k <= 2021; ++ k) {if (j >= k) f[i][j] += f[i - 1][j - k];}}}cout << f[5][2021]; }
  • 數(shù)論隔板法
  • 將2021拆分成2021個(gè)1,期間可以放2020個(gè)擱板,將2021分成五個(gè)正整數(shù)相加,也就是在這2020個(gè)擱板中選四個(gè)位置放四個(gè)擱板,因此,答案就是C20204C^4_{2020}C20204?
#include <iostream> #include <cstring> using namespace std; typedef long long ll;int main() {ll fenmu = 4 * 3 * 2;ll fenzi = 1;for (int i = 2020; i >= 2017; -- i)fenzi *= i;cout << fenzi / fenmu; }

試題 E: 城邦

  • prim
// 4046 #include <iostream> #include <cstring> using namespace std; typedef long long ll;int dist[2030]; int g[2030][2030]; bool st[2030];int calc(int x, int y) {int a[5], b[5];for (int i = 0; i < 4; ++ i) {a[i] = x % 10;b[i] = y % 10;x /= 10, y /= 10;}int res = 0;for (int i = 0; i < 4; ++ i) {if (a[i] != b[i])res += a[i] + b[i];}return res; } int prim() {memset(dist, 0x3f, sizeof dist);int res = 0;dist[1] = 0;for (int i = 0; i < 2021; ++ i) {int t = -1;for (int j = 1; j <= 2021; ++ j) {if (!st[j] && (t == -1 || dist[j] < dist[t])) {t = j;}}st[t] = true;res += dist[t];for (int j = 1; j <= 2021; ++ j)dist[j] = min(dist[j], g[t][j]);}return res; }int main() {for (int i = 1; i <= 2021; ++ i) {for (int j = 1; j <= 2021; ++ j) {if (i == j) g[i][j] = g[j][i] = 0x3f3f3f3f;g[i][j] = g[j][i] = calc(i, j);}}cout << prim(); }
  • kruscal
#include <iostream> #include <algorithm> using namespace std;const int N = 2021 * 2021 + 10, M = 2021 + 10;struct Edge {int a, b, w;bool operator< (Edge const&e) const {return w < e.w;} }e[N]; int cnt = 0; int p[M];int calc(int x, int y) {int a[5], b[5];for (int i = 0; i < 4; ++ i) {a[i] = x % 10;b[i] = y % 10;x /= 10, y /= 10;}int res = 0;for (int i = 0; i < 4; ++ i) {if (a[i] != b[i])res += a[i] + b[i];}return res; } int find(int x) {if (p[x] != x) p[x] = find(p[x]);return p[x]; } int kruscal() {int res = 0;for (int i = 1; i <= 2021; ++ i)p[i] = i;for (int i = 0; i < cnt; ++ i) {int a = e[i].a, b = e[i].b, w = e[i].w;a = find(a);b = find(b);if (a == b) continue;res += w;p[a] = b;}return res; } int main() {for (int i = 1; i <= 2021; ++ i) {for (int j = 1; j <= 2021; ++ j) {e[cnt ++ ] = {i, j, calc(i, j)};}}sort(e, e + cnt);cout << kruscal(); }

試題 F: 特殊年份

#include <iostream> using namespace std;bool check(int x) {int a[5];for (int i = 0; i < 4; ++ i) {a[i] = x % 10;x /= 10;}if (a[1] == a[3] && a[0] - 1 == a[2]) return true;return false; }int main() {int cnt = 0;for (int i = 0; i < 5; ++ i) {int year;cin >> year;if (check(year))cnt ++ ;}cout << cnt; }

試題 G: 小平方

#include <iostream> using namespace std;int main() {int n;cin >> n;int cnt = 0;for (int i = 1; i <= n - 1; ++ i) {int pf = i * i;if (pf % n < n / 2.0)cnt ++ ;}cout << cnt; }

試題 H: 完全平方數(shù)

#include <iostream> #include <cmath> using namespace std;bool check(int x) {int t = (int)sqrt(x);if (t * t == x)return true;return false; }int main() {int n;cin >> n;for (int i = 1; i <= n; ++ i) {if (check(i * n)) {cout << i << endl;return 0;}} }

試題 I: 負(fù)載均衡

#include <iostream> #include <queue> using namespace std; typedef pair<int, int> PII; const int N = 2e5 + 10;int power[N]; priority_queue<PII, vector<PII>, greater<PII>> que[N]; // 小頂堆數(shù)組int main() {int n, m;cin >> n >> m;for (int i = 1; i <= n; ++ i)cin >> power[i];while (m -- ) {int a, b, c, d;cin >> a >> b >> c >> d;while (que[b].size() && que[b].top().first <= a) {power[b] += que[b].top().second;que[b].pop();}if (power[b] < d) {cout << -1 << endl;} else {power[b] -= d;cout << power[b] << endl;que[b].push({a + c, d});}} }

試題 J: 國(guó)際象棋

  • 典型的 狀壓dp
  • 由于這里行數(shù)比列數(shù)少,因此我們枚舉每一列的擺放狀態(tài)
  • f[i][a][b][j]f[i][a][b][j]f[i][a][b][j]表示考慮前i列,第i-1列狀態(tài)為a,第i列狀態(tài)為b,且一共放了j個(gè)馬(因?yàn)檫@道題與數(shù)量有關(guān))的方案數(shù)
  • 確定正確的初始狀態(tài)
#include <iostream> using namespace std; const int N = 110, M = (1 << 6), K = 21, MOD = 1e9 + 7;int f[N][M][M][K];int get_count(int x) { // 二進(jìn)制下1的個(gè)數(shù)int res = 0;while (x) {res ++ ;x -= (x & -x);}return res; }int main() {int n, m, k;cin >> n >> m >> k;f[0][0][0][0] = 1; // 初始狀態(tài)for (int i = 1; i <= m; ++ i) { // 枚舉每一列for (int a = 0; a < (1 << n); ++ a) { // 第i-2列for (int b = 0; b < (1 << n); ++ b) { // 第i-1列if ((a & (b << 2)) || ((a << 2) & b)) continue; // 狀態(tài)矛盾for (int c = 0; c < (1 << n); ++ c) { // 第i列if ((c & (b << 2)) || ((c << 2) & b)) continue; // 狀態(tài)矛盾if ((c & (a << 1)) || ((c << 1) & a)) continue; // 狀態(tài)矛盾int t = get_count(c); // 根據(jù)第i列個(gè)數(shù)來(lái)確定總個(gè)數(shù)的下限for (int j = t; j <= k; ++ j) { // 枚舉總個(gè)數(shù)f[i][b][c][j] = (f[i][b][c][j] + f[i - 1][a][b][j - t]) % MOD;}}}}}int res = 0;for (int i = 0; i < (1 << n); ++ i) {for (int j = 0; j < (1 << n); ++ j) {res = (res + f[m][i][j][k]) % MOD;}}cout << res; }

總結(jié)

以上是生活随笔為你收集整理的第十二届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。