【蓝桥杯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弄明白(哭哭)。大家肯定比我厉害,昨天看评论区都在问能不能退钱哈哈,连我都在坚持,也希望大家可以共勉,没有进步的路是不痛苦的,我必成功,你们也是。

相关推荐
别NULL7 分钟前
机试题——最小矩阵宽度
c++·算法·矩阵
珊瑚里的鱼7 分钟前
【单链表算法实战】解锁数据结构核心谜题——环形链表
数据结构·学习·程序人生·算法·leetcode·链表·visual studio
无限码力11 分钟前
[矩阵扩散]
数据结构·算法·华为od·笔试真题·华为od e卷真题
gentle_ice12 分钟前
leetcode——矩阵置零(java)
java·算法·leetcode·矩阵
查理零世13 分钟前
保姆级讲解 python之zip()方法实现矩阵行列转置
python·算法·矩阵
zhbi9834 分钟前
测量校准原理
算法
时间很奇妙!1 小时前
decison tree 决策树
算法·决策树·机器学习
sysu631 小时前
95.不同的二叉搜索树Ⅱ python
开发语言·数据结构·python·算法·leetcode·面试·深度优先
红鲤鱼遇绿鲤鱼2 小时前
uva 1354 Mobile Computing
算法
‘’林花谢了春红‘’2 小时前
Leetcode::3432. 统计元素和差值为偶数的分区方案
算法·leetcode·职场和发展