移動距離(填空)**
小明初始在二維平面的原點,他想前往坐標 (233,666)。在移動過程中,他只能采用以下兩種移動方式,并且這兩種移動方式可以交替、不限次數地使用:
水平向右移動,即沿著 x 軸正方向移動一定的距離。
沿著一個圓心在原點 (0,0)、以他當前位置到原點的距離為半徑的圓的圓周移動,移動方向不限(即順時針或逆時針移動不限)。
在這種條件下,他到達目的地最少移動多少單位距離?你只需要輸出答案四舍五入到整數的結果。
解析:
最少移動單位距離=沿 x 軸正方向移動的距(半徑)+弧長
弧長=θ*半徑
tanθ=666/233
θ=arctan(666/233)
代碼
#include <iostream>
#include <cmath>
int main() {double r = sqrt(233*233 + 666*666);double theta = atan2(666, 233);double res = r + theta * r;printf("%.0lf", res); // 輸出1576return 0;
}
客流量上限(填空)**
一家連鎖旅館在全國擁有 2025 個分店,分別編號為 1 至 2025。隨著節日臨近,總部決定為每家分店設定每日客流量的上限,分別記作 A1?,A2?,…,A2025?。這些上限并非隨意分配,而是需要滿足以下約束條件:
A1?,A2?,…,A2025? 必須是 1 至 2025 的一個排列,即每個 Ai? 均是 1 至 2025 之間的整數,且所有 Ai? 互不相同。
對于任意分店 i 和 j(1≤i,j≤2025,i 可等于 j),它們的客流量上限 Ai? 和 Aj? 的乘積不得超過 i×j+2025。
這些約束旨在平衡各分店客流壓力,確保服務質量和運營穩定性。
現在,請你計算這樣的分配方案究竟有多少種。由于答案可能很大,你只需輸出其對 109+7 取余后的結果即可。
代碼
#include <iostream>
using namespace std;
const int mod = 1e9+7;
int main() {int n = 2025, res = 1;for (int i=0; i<1012; i++) res = res * 2 % mod;cout << res; // 輸出781448427return 0;
}
可分解的正整數(編程)
定義一種特殊的整數序列,這種序列由連續遞增的整數組成,并滿足以下條件:
序列長度至少為 3。
序列中的數字是連續遞增的整數(即相鄰元素之差為 1),可以包括正整數、負整數或 0。
例如,[1,2,3]、[4,5,6,7] 和 [?1,0,1] 是符合條件的序列,而 [1,2](長度不足)和 [1,2,4](不連續)不符合要求。
現給定一組包含 N 個正整數的數據 A1?,A2?,…,AN?。如果某個 Ai? 能夠表示為符合上述條件的連續整數序列中所有元素的和,則稱 Ai? 是可分解的。
請你統計這組數據中可分解的正整數的數量。
思路:直接統計輸入中非1的數的個數。
代碼
#include <iostream>
using namespace std;
int main() {int n, x, cnt=0;cin >> n;while (n--) {cin >> x;if (x != 1) cnt++;}cout << cnt;return 0;
}
產值調整(編程)
偏遠的小鎮上,三兄弟共同經營著一家小型礦業公司“兄弟礦業”。公司旗下有三座礦山:金礦、銀礦和銅礦,它們的初始產值分別用非負整數 A、B 和 C 表示。這些礦山的產出是小鎮經濟的核心,支撐著三兄弟和許多礦工家庭的生計。
然而,各礦山的產值波動劇烈,有時金礦收益高而銀礦、銅礦低迷,有時則相反。這種不穩定性讓公司收入難以預測,也常引發兄弟間的爭執。為了穩定經營,三兄弟設計了一個公平的產值調整策略,每年執行一次,每次調整時,將根據當前的產值 A、B、C,計算新產值:
計算出 A′、B′、C′ 后,同時更新:A 變為 A′,B 變為 B′,C 變為 C′,作為下一年調整的基礎。
三兄弟認為這個方法能平衡產值波動,于是計劃連續執行 K 次調整。現在,請你幫他們計算,經過 K 次調整后,金礦、銀礦和銅礦的產值分別是多少。
解析
多次調整后,A、B、C會收斂到相同值。模擬時若發現三者相等則提前終止循環。
代碼
#include <iostream>
using namespace std;
int main() {int T, A, B, C, K;cin >> T;while (T--) {cin >> A >> B >> C >> K;while (K--) {int a = (B + C) / 2, b = (A + C) / 2, c = (A + B) / 2;if (a == b && b == c) break;A = a, B = b, C = c;}cout << A << " " << B << " " << C << endl;}return 0;
}
畫展布置(編程)**
問題描述
畫展策展人小藍和助理小橋為即將舉辦的畫展準備了 N 幅畫作,其藝術價值分別為 A1?,A2?,…,AN?。他們需要從這 N 幅畫中挑選 M 幅,并按照一定順序布置在展廳的 M 個位置上。如果隨意挑選和排列,藝術價值的變化可能會過于突兀,導致觀眾的觀展體驗不夠流暢。
為了優化布置,他們查閱了《畫展布置指南》。指南指出,理想的畫展應使觀眾在欣賞畫作時,藝術價值的過渡盡量平緩。指南建議,選擇并排列 M 幅畫,應使藝術價值的變化程度通過一個數值 L 來衡量,且該值越小越好。數值 L 的定義為:
L=i=1∑M?1?∣Bi+12??Bi2?∣
其中 Bi? 表示展廳第 i 個位置上畫作的藝術價值。
現在,他們希望通過精心挑選和排列這 M 幅畫作,使 L 達到最小值,以提升畫展的整體協調性。請你幫他們計算出這個最小值是多少。
解析
當畫作按平方值排序后,最優解為連續M幅畫的平方值極差。例如:選排序后的連續子數組,最小化最大值與最小值之差。
代碼
#include <bits/stdc++.h>
using namespace std;
int main() {int N, M;cin >> N >> M;vector<long long> A(N);for (int i=0; i<N; i++) cin >> A[i], A[i] *= A[i];sort(A.begin(), A.end());long long ans = LLONG_MAX;for (int i=0; i+M-1 < N; i++)ans = min(ans, A[i+M-1] - A[i]);cout << ans;return 0;
}
以下是2025年第十六屆藍橋杯省賽C/C++大學B組其他題目的解析及參考答案:
F題:水質檢測(編程15分)
問題描述
在2×n的河床上,某些位置已有檢測器(用#
表示),其余為空白(.
)。要求添加最少的檢測器,使所有檢測器連通。求最少需添加的檢測器數量。
解析思路
采用動態規劃處理連通性問題。定義dp[i][j]
表示處理到第i列時,該列的上下行狀態為j(二進制表示,如1表示上行有檢測器,2表示下行,3表示上下均有)的最小添加數。狀態轉移需考慮前一列與當前列的連通性,確保相鄰列至少有一個位置連通。
代碼示例
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int main() {string s1, s2;cin >> s1 >> s2;int n = s1.size();vector<int> sta(n + 1);for (int i = 0; i < n; i++) {if (s1[i] == '#') sta[i + 1] |= 1;if (s2[i] == '#') sta[i + 1] |= 2;}// DP初始化及狀態轉移略cout << ans << endl;return 0;
}
生產車間(編程20分)
問題描述
給定一棵樹,每個節點代表車間,需去掉一些葉子節點,使得每個非葉子節點的子節點權值之和不大于其自身權值。求根節點(節點1)的葉子節點權值和最大值。
解析思路
采用樹形動態規劃結合分組背包思想。定義dp[u][j]
表示以節點u為根的子樹中是否存在路徑和為j的合法路徑。遞歸處理子節點,并通過分組背包合并子節點的狀態。
代碼示例
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
vector<int> g[N];
int w[N], n;
bool dp[N][N];
void dfs(int u, int fa) {dp[u][0] = true;if (g[u].size() == 1 && fa != 0) {dp[u][w[u]] = true;return;}for (int v : g[u]) {if (v == fa) continue;dfs(v, u);for (int j = w[u]; j >= 0; j--)for (int k = 0; k <= j; k++)if (dp[u][j - k] && dp[v][k]) dp[u][j] = true;}
}
裝修報價(編程20分)
問題描述
在數字間插入加減或異或符號,求所有可能計算值的總和。
解析思路
預處理前綴異或和,利用位運算性質分位統計貢獻。每位獨立計算,總和對每位貢獻求和。
代碼示例
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 1e9 + 7;
int main() {string s;cin >> s;int n = s.size();vector<ll> pow3(n + 1, 1);for (int i = 1; i <= n; i++) pow3[i] = pow3[i - 1] * 3 % MOD;// 預處理前綴異或和并計算貢獻cout << ans << endl;return 0;
}