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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

試題A :空間

67108864

試題B :卡片

// 答案是 3181 #include <iostream> using namespace std;int nums[15];bool check(int x) {while (x){int now = x % 10;x /= 10;if (nums[now] < 1) return false;nums[now] -- ;}return true; }int main() {for (int i = 0; i <= 9; i ++ ) nums[i] = 2021;for (int i = 1; ; i ++ ){if (!check(i)){cout << i - 1;return 0;}} }

試題C :直線

  • 需要注意當(dāng)垂直于x軸使無法計算斜率
  • 注意計算b時,式子中不要涉及到k,可以用整型,就不要用浮點數(shù)計算
// 答案是40257 #include <iostream> #include <map> using namespace std;const int N = 30 * 30;struct Point {int x, y; }p[N]; int cnt;map<pair<double, double>, int> ma;int main() {for (int i = 0; i < 20; i ++ )for (int j = 0; j < 21; j ++ ){p[cnt].x = i; p[cnt].y = j; cnt ++ ;}int res = 20 + 21;for (int i = 0; i < cnt; i ++ )for (int j = 0; j < cnt; j ++ ){int x1 = p[i].x, y1 = p[i].y, x2 = p[j].x, y2 = p[j].y;if (x1 == x2 || y1 == y2) continue;double k = 1.0 * (y2 - y1) / (x2 - x1);double m = 1.0 * (x2 * y1 - x1 * y2) / (x2 - x1);if (ma[{k, m}] == 0){res ++ ;ma[{k, m}] = 1;}}cout << res; }

試題D : 貨物擺放

  • a?b?c==na*b*c==na?b?c==n,不可能直接枚舉,發(fā)現(xiàn)abc的特點就是它們都是n的約束,因此我們可以直接枚舉n的所有約數(shù),復(fù)雜度大大降低
// 答案是2430 #include <iostream> #include <vector> using namespace std;typedef long long ll;const ll n = 2021041820210418;int main() {ll res = 0;vector<ll> ve;for (ll i = 1; i * i <= n; i ++ ){if (n % i == 0){ve.push_back(i);if (i * i != n) ve.push_back(n / i);}}for (auto i : ve)for (auto j : ve)for (auto k : ve)if (i * j * k == n)res ++ ;cout << res; }

試題E :路徑

// 答案是10266837 #include <iostream> #include <cstring> using namespace std;const int N = 2030;int gcd(int a, int b) {return b ? gcd(b, a % b) : a; }int dist[N][N];int main() {memset(dist, 0x3f, sizeof dist);for (int i = 1; i <= 2021; i ++ )for (int j = 1; j <= 2021; j ++ ){if (i == j) dist[i][j] = 0;else if (abs(i - j) <= 21) dist[i][j] = min(dist[i][j], i * j / gcd(i, j));}for (int i = 1; i <= 2021; i ++ )for (int j = 1; j <= 2021; j ++ )for (int k = 1; k <= 2021; k ++ )dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);cout << dist[1][2021]; }

試題F :時間顯示

#include <iostream> #include <cstring> using namespace std;typedef long long ll;int main() {ll n; cin >> n;ll time = n / 1000;ll ss = time % 60;ll mm = time / 60 % 60;ll hh = time / 3600 % 24;printf("%02lld:%02lld:%02lld", hh, mm, ss); }

試題G :砝碼稱重

  • 砝碼可以放在天平兩邊或者不放,相當(dāng)于砝碼的重量可以為正貢獻(xiàn)也可以為負(fù)貢獻(xiàn)或者沒有貢獻(xiàn)
  • 由于j + w[i],因此可能會出現(xiàn)越界,要把M開大一些
#include <iostream> #include <cmath> using namespace std;const int N = 110, M = 2e5 + 10;int n, w[N]; bool f[N][M];int main() {cin >> n;int sum = 0;for (int i = 1; i <= n && cin >> w[i]; i ++ ) sum += w[i];f[0][0] = true;for (int i = 1; i <= n; i ++ ){for (int j = 0; j <= 100000; j ++ ){f[i][j] = f[i - 1][j];f[i][j] |= f[i - 1][abs(j - w[i])];f[i][j] |= f[i - 1][j + w[i]];}}int res = 0;for (int i = 1; i < M; i ++ )if (f[n][i])res ++ ;cout << res; } // TLE #include <iostream> using namespace std;const int N = 110, M = 1e5 + 10;int n, w[N]; bool vis[M];void dfs(int i, int sum) {if (i == n + 1){vis[abs(sum)] = true;return ;}dfs(i + 1, sum);dfs(i + 1, sum - w[i]);dfs(i + 1, sum + w[i]); }int main() {cin >> n;for (int i = 1; i <= n && cin >> w[i]; i ++ );dfs(1, 0);int res = 0;for (int i = 1; i < M; i ++ )if (vis[i])res ++ ;cout << res; }

試題H :楊輝三角形


  • 由于左右對稱,要找第一次出現(xiàn)的位置,因此右半部分不需要考慮
  • 楊輝三角中每個數(shù)都可以用 組合 來表示,且同一行中的下角標(biāo)相同,同一斜行的上角標(biāo)相同
  • 1e9數(shù)據(jù),以行和列來枚舉是不現(xiàn)實的,因此我們考慮以每一斜行(下面以“列”代稱)來入手
  • 每一列中,從上到下嚴(yán)格單調(diào)遞增,因此,在每一列中,可以用二分查找n,而且我們發(fā)現(xiàn)在僅使用一半的楊輝三角以后,每一列中最上面的那個數(shù)是C2iiC^{i}_{2i}C2ii?,而最下面的那個數(shù)僅與當(dāng)前枚舉的行數(shù)有關(guān),最多肯定是n行,則為C2n1C^{1}_{2n}C2n1?;列與列之間,最上面的數(shù)是遞增的,且越靠下的列出現(xiàn)第一次出現(xiàn)的數(shù)的概率更高,因此,我們從最下面的列開始枚舉,從計算最上面的數(shù)可知我們只需要枚舉到第十七列(從第零列開始)
  • 關(guān)于如果計算CnmC^{m}_{n}Cnm?的優(yōu)化
#include <iostream> using namespace std;typedef long long ll;int x;ll C(int n, int m) {ll res = 1;for (int i = n, j = 1; i >= n - m + 1; i -- , j ++ ){res = res * i / j;if (res > x) return res;}return res; }bool check(int k) {int l = 2 * k - 1, r = max(l, x) + 1; // 保證右邊界大于等于左邊jie // int l = 2 * k, r = x;while (l + 1 != r){int mid = l + r >> 1;if (C(mid, k) >= x) r = mid;else l = mid;}if (C(r, k) == x){cout << 1ll * r * (r + 1) / 2 + k + 1;return true;}return false; }int main() {cin >> x;for (int i = 17; ; i -- )if (check(i))break; } // 20%分?jǐn)?shù) #include <iostream> #include <cmath> using namespace std;int f[2510][2510]; int cnt;int main() {int n; cin >> n;f[0][0] = 1;for (int i = 1; i <= 2500; i ++ ){for (int j = 1; j <= i; j ++ ){f[i][j] = f[i - 1][j - 1] + f[i - 1][j];cnt ++ ;if (f[i][j] == n){cout << cnt;return 0;}}} }

試題I :雙向排序(暫跳)

試題J :括號序列

總結(jié)

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

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