【蓝桥杯3.23小白赛】(详解)

第一题签到题不多说

【二进制王国】

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//int Cmp(string s1, string s2)测试了一下时间差确实很明显,还是用下面的内个
int Cmp(const string &s1,const string &s2)
//const 修饰表示在函数内部不会修改参数的值
//引用 & 的形式可以避免在传递参数时进行字符串的复制,提高效率
{
  return s1+s2<s2+s1;//return true
}

int main() {
  int n;
  cin >> n;
  vector<string> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  sort(a.begin(),a.end(),Cmp);
  for (int i=0;i<n;i++) {
    cout<<a[i];
  }
  return 0;
}

因为题目中给的案例主观臆断都是三位数(龙怒),没有考虑到两位的情况,like:10和1,当字符串长度不相等时,会根据字符串的长度来进行比较,"1" 的长度小于 "10",所以在排序时 "1" 会被排在 "10" 前面,最终输出的结果是 "110"

【djwcb】

cpp 复制代码
#include <iostream>
#include<math.h>
#include<string>
using namespace std;
int main()
{
    int t = 0;
    cin >> t;
    int x;
    string p;
    for (int i = 0; i < t; i++) {
        cin >> x >> p;
        int k;
       if (p.size() > 1) 
       {
            k = stoi(p.substr(p.size() - 2, p.size()));
       }
        else k = stoi(p.substr(p.size() - 1, p.size()));
        k %= 4;
        x %= 10;
       
        if (!k)k = 4;
        int res = 1;
        res = pow(x, k);
        cout << res%10 << endl;
    }
    return 0;
}

因为题目给的数据非常大,暴力首先pass掉了,肯定得找规律,列几个数可以发现每四个一个循环,所以只把k对4取余就行,这里要注意至少保留两位,我当时是只保留了一位(like:2%4和12%4,昨天听课评论区大佬指出来的,再次感谢),算完之后取最后一位即可

【求解线性方程组】

cpp 复制代码
#include <iostream>
#define LL long long
#define cir(i,a,b) for(int i=a;i<=b;i++) 
using namespace std;
const int N=2e5+5;
int a[N],x[N],y[N];
int main()
{
    int n;
    cin>>n;
    cir(i,1,n)
    {
        cin>>a[i];
    }
     x[1]=0;//x1是0
     bool det=false;
     cir(i,2,n)
    {
        x[i]=a[i-1]-x[i-2]-x[i-1];
        if(!(x[i]==1||x[i]==0))
        {
            det= true;
            break;
        }
    }
     y[1]=1;//是1
    cir(i,2,n)
    {
        y[i]=a[i-1]-y[i-2]-y[i-1];
    }
    if(!det)
    {
        cir(i,1,n)
        cout<<x[i]<<" ";
    }
    else{
        cir(i,1,n)
        cout<<y[i]<<" ";
    }
    

  // 请在此输入您的代码
  return 0;
}

取值只能是0和1(微笑),当时看评论区有人也说到了这个点儿,眼睛瞪得像铜铃,或许仔细再想想我也能做出来了也说不定(咬抹布哭)

定x1的值,其他值都是确定的,所以只有两种情况,肯定是0在前面的字典序小(我恨,感觉脑子被题摁在地上摩擦)

x2=a1-x1;

x3=a2-x1-x2;

x4=a3-x2-x3...

【美丽圆环】(题说你看看我~ 美 ~吗)

cpp 复制代码
#include <iostream>
#include<algorithm>
using namespace std;

int main()
{
    int t;
    cin >> t;
     while (t--)
    {
        int n;
        cin >> n;
        int a[101];
        int count=0;
        for (int i = 0; i < n; i++)
            cin >> a[i];
            sort(a,a+n);
        if(n==2)
        {
            if(a[0]==a[1])
            count=0;
            else
            count=1;
        }
        else
        {
            if(a[0]!=a[1])//首比两边小
            count++;
            if(a[n-1]!=a[n-2])//尾比两边大
            count++;
            if(count==2)
            {
                if(a[1]==a[2]||a[n-2]==a[n-3])
                count=1;
            }
        }
        cout<<count<<endl;
       
    }
    return 0;
}

可以操作1,也可以操作2,一开始没看明白题意,只要使操作2最少就行。因为不限制操作1的次数,只要中间是按从小到大顺序排序的都符合条件,肯定左边小右边大大不了就相等,只考虑首尾衔接就行
if(a[1]==a[2]||a[n-2]==a[n-3])

这个算首尾的特殊情况吧,因为首尾面对的不是大大就是小小,如果有一种和它相等的情况就可以不考虑替换。like:1 2 3 4 5变 5 2 3 4 5 小2现在就是很尴尬的境地,但是 1 2 2 4 5变5 2 2 4 5 就可以啦,可以多画画试试,这里就不举别的例子了

【小兰的跳跃】

贪心

cpp 复制代码
#include <iostream>
#define LL long long 
using namespace std;
const int N=2e5+5;
const int X=4e5+5;
int a[N];

int main()
{
    int t;//组数
    cin>>t;
    while(t--)
    {
        int n,x;//格子数,最终心情
        cin>>n>>x;
       for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        a[n+1]=0;
        int min=0,max=0,i=0;
        while(i!=n&&i!=n+1)
        {
            if(a[i+1]==-1)
            {
                min+=a[i+1];
                 i++;
            }
            else
            {
                min+=a[i+2];
                i+=2;
            }
           }
        i=0;
   		 while(i!=n&&i!=n+1)
        {
            if(a[i+1]==1)
            {
                max+=a[i+1];
                 i++;
            }
            else
            {
                max+=a[i+2];
                i+=2;
            }
         }
       if (x >= min && x <= max)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
  return 0;
}

dp

cpp 复制代码
#include <iostream>
#include<cmath>
#define LL long long 
using namespace std;
const int N=2e5+5;
const int X=4e5+5;
int a[N],dp1[N],dp2[N];

int main()
{
    int t;//组数
    cin>>t;
    while(t--)
    {
        int n,x;//格子数,最终心情
        cin>>n>>x;
       for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        a[n+1]=0;
        dp1[1]=a[1],dp2[1]=a[1];
        for(int i=2;i<=n+1;i++)
        {
            dp1[i]=min(dp1[i-1],dp1[i-2])+a[i];
            dp2[i]=max(dp2[i-1],dp2[i-2])+a[i];
        }
if (x >= dp1[n+1] && x <= dp2[n+1])
            cout<<"Yes"<<'\n';
        else
            cout<<"No"<<'\n';
    }
    return 0;
    }

只要在最大值和最小值中间就行,这个详解也可以参考我原来发的台阶方案那一篇
总之这次出的zhei叫一个不地地地地地地地地道(划掉),打下这篇文章就是为了先把这句话敲上(bushi)。学算法之后每天都出去溜达溜达晒太阳,因为身上的怨气比 都大

言归正传,做的时候完整敲了仨题除了签到的都给我扣下了(嘻嘻),正好我c语言助教今天在我旁边问我有没有学到什么,我跟他仔细反思了错误和可以进步的地方,然后今天又把这几个题敲了一遍

我在三月初的代码经历还停留在hello world上有点儿夸张吧,但是确实我直到昨天才把for里面i<n还是<=n弄明白(哭哭)。大家肯定比我厉害,昨天看评论区都在问能不能退钱哈哈,连我都在坚持,也希望大家可以共勉,没有进步的路是不痛苦的,我必成功,你们也是。

相关推荐
Forever Nore9 分钟前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考2 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX2 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面3 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号3 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽3 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI4 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者5 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者5 小时前
【征程6】校准量化中HistogramObserver解析
算法
OuO-26 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵