第15届省赛蓝桥杯大赛C/C++大学B组

张开发
2026/4/10 22:21:23 15 分钟阅读

分享文章

第15届省赛蓝桥杯大赛C/C++大学B组
目录一.握手问题1.题目讲解2.代码实现二.小球反弹1.题目讲解2.代码实现三.好数1.题目讲解2.代码实现四.R 格式1.题目讲解2.代码实现五.宝石组合1.题目讲解2.代码实现六.数字接龙1.题目讲解2.代码实现七.拔河1.题目讲解2.代码实现一.握手问题题目链接:https://www.lanqiao.cn/problems/19695/learning/1.题目讲解2.代码实现#include iostream using namespace std; int main() { cout (50 * 49 - 7 * 6) / 2 endl; return 0; }二.小球反弹题目链接:https://www.lanqiao.cn/problems/19732/learning/1.题目讲解2.代码实现#include iostream #include cmath using namespace std; typedef long long LL; LL gcd(LL a, LL b) { return b 0 ? a : gcd(b, a % b); } int main() { LL x 15 * 233333, y 17 * 343720; LL d gcd(x, y); LL a x / d * 2 * 343720, b y / d * 2 * 233333; printf(%.2lf, sqrt(a * a b * b)); return 0; }三.好数题目链接:https://www.lanqiao.cn/problems/19709/learning/1.题目讲解直接暴力就可以了2.代码实现#include iostream using namespace std; bool check(int x) { int i 1; while(x) { if((x % 10) % 2 ! i % 2) return false; x / 10; i; } return true; } int main() { int n; cin n; int ret 0; for(int i 1; i n; i) if(check(i)) ret; cout ret endl; return 0; }四.R 格式题目链接:https://www.lanqiao.cn/problems/19710/learning/1.题目讲解2.代码实现#include iostream using namespace std; const int N 1e6 10; int n; string d; int a[N], len, p; void mul() { // 不断乘 2 int c 0; for(int i 0; i len; i) { a[i] a[i] * 2 c; c a[i] / 10; a[i] % 10; } if(c) a[len] c; } int main() { cin n d; len d.size() - 1; for(int i 0, t len - 1; i d.size(); i) { if(d[i] .) p d.size() - i - 1; // 小数点后的位数 else a[t--] d[i] - 0; // 把浮点数逆序放在 a 数组中 } // 乘 n 次 2 for(int i 1; i n; i) mul(); // 判断四舍五入 if(a[p - 1] 5) { int c 1; for(int i p; i len c; i) { a[i] a[i] c; c a[i] / 10; a[i] % 10; } if(c) a[len] c; } for(int i len - 1; i p; i--) cout a[i]; return 0; }五.宝石组合题目链接:https://www.lanqiao.cn/problems/19711/learning/1.题目讲解2.代码实现#include iostream #include algorithm using namespace std; const int N 1e5 10; int n, a[N], cnt[N]; void get_d(int x) { for(int i 1; i x / i; i) { if(x % i 0) { cnt[i]; if(i ! x / i) cnt[x / i]; } } } int main() { cin n; for(int i 1; i n; i) { cin a[i]; get_d(a[i]); // 预处理每一个数的约数 } // 找最大的公约数 int x; for(int i 1e5; i 0; i--) { if(cnt[i] 3) { x i; break; } } // 找出最小的三个数 sort(a 1, a 1 n); for(int i 1, sum 0; i n; i) { if(a[i] % x 0) { cout a[i] ; sum; } if(sum 3) break; } return 0; }六.数字接龙题目链接:https://www.lanqiao.cn/problems/19712/learning/1.题目讲解2.代码实现#include iostream #include vector using namespace std; const int N 15; int n, k; int g[N][N]; bool st[N][N], check[N][N][N][N]; vectorint path; int dx[] {-1, -1, 0, 1, 1, 1, 0, -1}; int dy[] {0, 1, 1, 1, 0, -1, -1, -1}; bool dfs(int a, int b) { if(a n - 1 b n - 1) { if(path.size() n * n - 1) return true; else return false; } st[a][b] true; for(int i 0; i 8; i) // 保证字典序最小 { int x a dx[i], y b dy[i]; if(x 0 || x n || y 0 || y n || st[x][y]) continue; if((g[a][b] 1) % k ! g[x][y]) continue; if(i % 2 1 (check[a][y][x][b] || check[x][b][a][y])) continue; path.push_back(i); check[a][b][x][y] true; if(dfs(x, y)) return true; path.pop_back(); check[a][b][x][y] false; } st[a][b] false; return false; } int main() { cin n k; for(int i 0; i n; i) for(int j 0; j n; j) cin g[i][j]; if(!dfs(0, 0)) cout -1 endl; else { for(auto x : path) cout x; } return 0; }七.拔河题目链接:https://www.lanqiao.cn/problems/19713/learning/1.题目讲解2.代码实现#include iostream #include set using namespace std; typedef long long LL; const int N 1e5 10; int n; LL a[N]; setLL mp; int main() { cin n; for(int i 1; i n; i) cin a[i]; LL ret 1e9; for(int l 2; l n; l) { LL sum 0; // 把新产生的区间和放进 set 中 for(int i l - 1; i 1; i--) { sum a[i]; mp.insert(sum); } sum 0; // 枚举右区间 for(int r l; r n; r) { sum a[r]; // 在左边区域快速找出离 sum 最近的区间和 auto it mp.lower_bound(sum); if(it ! mp.end()) ret min(ret, *it - sum); if(it ! mp.begin()) { it--; ret min(ret, sum - *it); } } } cout ret endl; return 0; }

更多文章