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

简介: A、签到 B、结论性排序 C、找规律+暴力 D、找规律+递推+贪心 E、找规律+贪心 F、dp

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即可。
image.png

#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的方案可行。最后输出满足题意的那一种方案即可。
image.png

#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;
}

相关文章
|
3月前
|
Java 开发者 Python
编程之道:从小白到大牛的心路历程
【9月更文挑战第1天】编程,不仅仅是敲击键盘、编写代码那么简单。它是一种思维的锻炼,一种解决问题的艺术,更是一种生活的态度。本文将带你走进编程的世界,从最初的迷茫与困惑,到逐渐找到方向,再到深入探索与提升,最后实现自我价值的蜕变。让我们一起感受编程的魅力,体验技术的力量。
|
5月前
|
存储 人工智能 BI
【蓝桥】蓝桥小白入门赛7
A、签到 B、暴力 C、模拟 D、二进制、枚举 E、优先队列 F、二维前缀和+滑动窗口
57 9
|
5月前
【蓝桥】蓝桥小白入门赛6
A、签到 B、模拟 C、推结论+模拟 D、找规律 E、贪心+双指针 F、二分
56 6
|
7月前
|
人工智能 BI
牛客小白月赛66
牛客小白月赛66
43 0
|
安全 程序员 Python
这篇写给想选计算机专业的学弟学妹们
另外,这次我专门在自己母校拍了个视频,也算做个小宣传。但因为没经验、没设备,所以拍得比较业余,有人表示根本看不下去图片。纠结了一番我决定还是发出来。我经常跟同学说,你开始写代码不知道怎么写太正常不过了,谁不都是从小白过来的。
下一篇
DataWorks