2025蓝桥省赛B组c++题目

2025蓝桥省赛B组c++题目

A:移动距离

[P12130 蓝桥杯 2025 省 B] 移动距离 - 洛谷

image-20250618090052160

 旋转角度:θ=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] 客流量上限 - 洛谷

image-20250618090533441

题意就是求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] 可分解的正整数 - 洛谷

image-20250618091028088

最后根据规律我们发现好像只有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] 产值调整 - 洛谷

image-20250618091337401

#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] 画展布置 - 洛谷

image-20250618091548784

我们发现排一个序号找最小值就可以因为,挑选的话直接找连续的片段然后我们根据直求
我们发现可以直接约掉中间的
只剩下两端

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] 水质检测 - 洛谷

image-20250618092223295

因为两行分三种情况
#
#

#
.

.
#

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] 生产车间 - 洛谷

image-20250618093211289


G:装修报价

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

image-20250618093728666

image-20250618093738613

计算贡献

因此对于每个前缀异或,其贡献为: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;
}
posted @ 2025-06-24 21:50  Godjian  阅读(250)  评论(0)    收藏  举报