2025蓝桥省赛B组c++题目
2025蓝桥省赛B组c++题目
A:移动距离
[P12130 蓝桥杯 2025 省 B] 移动距离 - 洛谷

旋转角度:θ=arcsin(666/r)
#include <bits/stdc++.h>
int main() {
double r = sqrt(233 * 233 + 666 * 666);
int res = r + asin(666.0 / r) * r;
std::cout << res;
cout<<round(ans); // 库函数四舍五入
}
B:客流量上限
[P12131 蓝桥杯 2025 省 B] 客流量上限 - 洛谷

题意就是求1到2025的排列A1到A2025使得任意的ai×aj《ixj+2025都成立的合法排列数量。
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
int qmi(int m, int k, int p) {
long long t = m, res = 1;
while (k ) {
if (k&1) res = res*t%p;
t = t*t%p;
k >>=1;
}
return res;
}
int power(int m, int k, int p) {
int res = 1;
while (k--)
res = res * m % p;
return res;
}
signed main() {
cout << qmi(2, 1012, MOD) << "\n";
cout << power(2, 1012, MOD) << "\n";
return 0;
}
C:可分解的正整数
[P12132 蓝桥杯 2025 省 B] 可分解的正整数 - 洛谷

最后根据规律我们发现好像只有1不可以
因为所以的都可以用对称法解决
如
4
-3 -2 -1 0 1 2 3 4
#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
int ans=0;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x!=1)
{
ans++;
}
}
cout<<ans<<endl;
return 0;
}
D:产值调整
[P12133 蓝桥杯 2025 省 B] 产值调整 - 洛谷

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
void solve(){
int A1,B1,C1,K;
cin>>A1>>B1>>C1>>K ;
while(K--){
int A2=(B1+C1)/2;
int B2=(A1+C1)/2;
int C2=(A1+B1)/2;
A1=A2,B1=B2,C1=C2;
if(A1==B1&&B1==C1)break;//关键一步,不然卡数据
}
cout<<A1<<" "<<B1<<" "<<C1<<endl;
};
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
TESTS{
solve();
};
return 0;
}
D:画展布置
[P12134 蓝桥杯 2025 省 B] 画展布置 - 洛谷

我们发现排一个序号找最小值就可以因为,挑选的话直接找连续的片段然后我们根据直求
我们发现可以直接约掉中间的
只剩下两端
1 2 3 4
#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
int n,m;
int sum[N],sum1[N];
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=1e18;
sort(a+1,a+n+1);
//for(int i=2;i<=n;i++)b[i]=a[i+1]*a[i+1]-a[i]*a[i];
for(int i=1;i<=n-m+1;i++){
ans=min(ans,a[i+m-1]*a[i+m-1]-a[i]*a[i]);
}
cout<<ans<<endl;
return 0;
}
E:水质检测
[P12135 蓝桥杯 2025 省 B] 水质检测 - 洛谷

因为两行分三种情况
#
#
#
.
.
#
OK然后我们直接进行讨论
#.......#
#........
ans+=i-list-1;
#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string str1,str2;
cin>>str1>>str2;
int ans=0;
int staus=-1,list=-1;
for(int i=0;i<str1.length();i++){
if(str1[i]=='.'&&str2[i]=='.')continue;
if(list!=-1){
ans+=i-list-1;
}
if(str1[i]=='#'&&str2[i]=='#'){
staus=3;
}else if(str1[i]=='#'&&str2[i]=='.'){
if(staus==2){
ans++;
staus=3;
}else{
staus=1;
}
}else if(str1[i]=='.'&&str2[i]=='#'){
if(staus==1){
ans++;
staus=3;
}else{
staus=2;
}
}
list=i;
}
cout<<ans<<endl;
return 0;
}
F:生产车间
[P12136 蓝桥杯 2025 省 B] 生产车间 - 洛谷

G:装修报价
第十六届蓝桥杯C++B组省赛真题 - 题单 - 洛谷 | 计算机科学教育新生态


计算贡献
因此对于每个前缀异或,其贡献为:pre_xor×2×3
n−i−1
我们发现中间的会被加或者减抵消我们只要求解
#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
int ksm(int a, int b, int p) {
int ans = 1;
a %= p;
while(b) {
if(b & 1) ans = (ans * a) % p;
b >>= 1;
a = (a * a) % p;
}
return ans % p;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
int s=0;
int ans=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
s^=x;
if(i<n){
ans+=s*2*ksm(3LL,n-i-1,mod)%mod;
}else{
ans+=s;
}
ans%=mod;
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号