【蓝桥】蓝桥小白入门赛8

原题链接:第 8 场 小白入门赛 - 蓝桥云课

目录

A、坤星球

B、 二进制王国

C、 djwcb

D、 求解线性方程组

E、 美丽圆环

F、小蓝的跳跃


A、坤星球

签到题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cout << 2024 * 2.5 << endl;
	return 0;
}

B、 二进制王国

两个字符串a,b按字典序排序,判断a+b和b+a的关系即可,自定义一个bool类型的cmp函数,然后return a+b<b+a 。使用sort()函数对字符串进行排序。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 2e5 + 10;
string s[N];

bool cmp(string a, string b) {
	return a + b < b + a;
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n; cin >> n;
	for (int i = 1; i <= n; i++) cin >> s[i];
	sort(s + 1, s + n + 1, cmp);
	for (int i = 1; i <= n; i++) cout << s[i];
	return 0;
}

C、 djwcb

找规律。我们依次枚举0~9每个数的n次幂,会发现每个数的n次幂的个位数都有以4个为一周期的规律。首先我们将x%=10(因为其实只要看个位数的变化就行)。同时因为题目中的p很大,我们用字符串存p。遍历字符串p将字符串p转成整数同时%4,用res记录结果。如果最后res=0,说明正好整除,我们就让res=4。最后按照题意求pow(x,res)%10即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'

void solve(){
    int x; string p;
    cin>>x>>p;
    x%=10;
    int res=0;
    for(int i=0;i<p.size();i++){
        res=(res*10+p[i]-'0')%4;
    }
    if(res==0) res=4;
    int ans=pow(x,res);
    cout<<ans%10<<endl;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

D、 求解线性方程组

找规律,通过递推找出关系式x[i]=a[i-1]-x[i-1]-x[i-2]。因为xi只能为0或1,所以我们让x1=0或x1=1分类讨论这两种情况即可。因为要求字典序最小的解,我们先讨论x[1]=0的情况,如果通过递推其中某个x[i]不为0且x[i]不为1,说明x1=0的方案不可行,而题目又保证线性方程组至少存在一组解且合法,那么说明此时x1=1的方案可行。最后输出满足题意的那一种方案即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N=2e5+10;
int n,a[N],x[N],y[N];

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    x[1]=0;
    int f=0;
    for(int i=2;i<=n;i++){
        x[i]=a[i-1]-x[i-1]-x[i-2];
        if(x[i]!=0&&x[i]!=1){
            f=1;
            break;
        }
    }
    y[1]=1;
    for(int i=2;i<=n;i++){
        y[i]=a[i-1]-y[i-1]-y[i-2];
    }
    if(!f){
        for(int i=1;i<=n;i++) cout<<x[i]<<" ";
        cout<<endl;
    }else{
        for(int i=1;i<=n;i++) cout<<y[i]<<" ";
        cout<<endl;
    }
    return 0;
}

E、 美丽圆环

给定两个操作,操作1是让数组上的任意数字更改为任意整数,操作2交换数组上任意两个数的位置。题意是让一个数ai左右两侧的数其中一个大于等于ai,另一个小于等于ai。求操作1的最小次数。

首先我们对原数组进行排序。此时除了,首尾两个数,其余数都满足其左右两侧数一个数大于等于ai,另一个数小于等于ai。

我们再进行分类讨论(这里数组下标为1~n,ans表示操作1的次数):

1、如果数组长度n为2,那么如果a1=a2,不需要进行操作,ans=0;否则a1!=a2,需要进行一次操作让a1=a2,ans=1。

2、n>2的情况,因为已经排序了。如果a1!=a2(此时a1<a2,a1<a[n],需要将a1变成a[n]才符合题意,此时操作数ans++),如果a[n-1]!=a[n](此时a[n-1]<a[n],a1<a[n],需要将a[n]变成a[n-1]才符合题意,此时操作数ans++)。需要注意的是,如果a2=a3或者a[n-2]=a[n-1],只需要改变a1,用操作2交换位置即可(如1 2 2 4 5 变成 5 2 2 4 5),此时令ans=1。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'

void solve(){
    int n; cin>>n;
    vector<int> a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a.begin()+1,a.end());
    int ans=0;
    if(n==2){
        if(a[1]!=a[2]) ans=1;
    }else{
        if(a[1]!=a[2]) ans++;
        if(a[n-1]!=a[n]) ans++;
        if(ans==2){
            if(a[2]==a[3]||a[n-2]==a[n-1]) ans=1;
        }
    }
    cout<<ans<<endl;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

F、小蓝的跳跃

dp(很经典的跳格子问题的变式)。记录到最后一个点的最小值和最大值,如果x在这个区间内就是可以调整(如果比x小了,就多走一些+1,少走一些-1;如果比x大了,多走一些-1,少走一些+1),可以到达x。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'

void solve(){
    int n,x; cin>>n>>x;
    vector<int> a(n+5);
    for(int i=1;i<=n;i++) cin>>a[i];
    vector<int> b(n+5),c(n+5);
    b[1]=c[1]=a[1];
    for(int i=2;i<=n+1;i++){
        b[i]=min(b[i-1],b[i-2])+a[i];
        c[i]=max(c[i-1],c[i-2])+a[i];
    }
    if(x>=b[n+1]&&x<=c[n+1]) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t; cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值