温馨提示:本系列文章非所有题都对对b组适用,b组的小伙伴请挑题看! 

目录

第一题

题目链接

题目解析

代码原理

代码编写

本题总结

第二题

题目链接

题目解析

代码原理

代码编写

本题总结

第三题

题目链接

题目解析

代码原理

代码编写

本题总结

第四题

题目链接

题目解析

代码原理

如何找规律?

代码编写

本题总结

第五题

题目链接

题目解析

代码原理

代码编写

第六题

题目链接

题目解析

代码原理

代码编写

代码一

代码二

代码优化

本题总结

1.题目特征的总结

2.函数总结

3.全排列模板总结

第七题

题目链接

题目解析

代码原理

代码编写

代码一

代码二

本题总结


第一题

题目链接

0奇妙的数字 - 蓝桥云课

题目解析

代码原理

对于零基础小白而言,平方和立方都不是难事,用个pow()函数就可以解决,实在不会还有i * i * i这种方式解决。这里对零基础小白而言博主盲猜应该是如何判断,其实很简单,我们可以将平方和立方后得到结果转为字符串,然后将两个字符串拼接在一起,最后去判断长度即可,但是也会有小伙伴问那重复了怎么办,很简单使用set容器即可,这里建议新加入的小白可以先去看一下下面这篇文章

文章链接 

C++STL初识和各大容器详解-CSDN博客

代码编写

#include<iostream>

#include<bits/stdc++.h>

typedef long long ll;

using namespace std;

bool check(string ret)

{

  set<char> d;

  for(int i = 0; i < ret.size(); i++)

  {

    d.insert(ret[i]);

  }

  return ret.size() == 10 && d.size() == 10;

}

int main()

{

  ll n = 100000;

  string s1, s2;

  for(ll i = 1; i < n; i++)

  {

    ll tmp = i * i;

    s1 = to_string(tmp);

    tmp = i * i * i;

    s2 = to_string(tmp);

    string ret = s1 + s2;

    if(check(ret))

    {

      cout << i;

      break;

    }

  }

  return 0;

}

本题总结

第二题

题目链接

题目解析

代码原理

代码编写

#include<iostream>

#include<bits/stdc++.h>

using namespace std;

int main()

{

  ios::sync_with_stdio(0);

  cin.tie(0);

  cout.tie(0);

  int n = 0;

  cin >> n;

  int ret = n;

  while(n >= 3)

  {

    int new_bottles = n / 3;

    ret += new_bottles;

    n = n % 3 + new_bottles;

  }

  cout << ret;

  return 0;

}

本题总结

本题其实没有什么可以总结的,但是在做题上还是有东西可以总结的,有的小伙伴可能读完题目就发呆了,不知道干什么,那么今天博主带大家解决一下这类问题。

1.在读题的时候,我们可以记录一下一些有用的信息

2.需要画图的时候,就一定要画图,不要凭借脑子在那里空想

3.根据自己的图解,进行编写代码

4.如果出现报错,那么先去看一下报错信息(这里可能就需要一点英语词汇量了,这个自行解决),如果是timeout之类的词说明超时了,那么你就需要重新去检查代码,看看哪里死循环了,当然不是所有的超时都是死循环,有的是超过了题目所规定的时长,那么这个就是时间复杂度上的问题了,那么又会有小伙伴问了,那我看代码,具体该怎么看呢?我们把自己当成计算机,一步一步地去执行每一行代码即可。

第三题

题目链接

题目解析

代码原理

代码编写

本题总结

第四题

题目链接

题目解析

代码原理

如何找规律?

 观察数字之间的关系,是不是求和、指数,以及两者之间的差值是否存在什么关系

代码编写

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int sum = 1, i = 1, j = 2;
    for(int t = 2; t <= 100; t++)
    {
        sum += i + j;
        i += j; //更新i
        j++;//更新j 
     } 
     cout << sum << endl; 
    return 0;
}

本题总结

第五题

题目链接

题目解析

代码原理

代码编写

第六题

题目链接

0寒假作业 - 蓝桥云课

题目解析

代码原理

全排列 + 判断

代码编写

代码一

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13}; 
int ans;
bool judge()
{
    if(a[0] + a[1] == a[2] && a[3] - a[4] == a[5] && a[6] * a[7] == a[8] && a[9] % a[10] == 0 && a[9] / a[10] == a[11])
       return true;
    return false;
}
int main()
{
    do{
        if(judge())
          ans++;
    }while(next_permutation(a, a + 13));
    cout << ans;
    return 0;
}

代码二

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13}; 
int ans;
bool judge()
{
    if(a[0] + a[1] == a[2] && a[3] - a[4] == a[5] && a[6] * a[7] == a[8] && a[9] % a[10] == 0 && a[9] / a[10] == a[11])
       return true;
    return false;
}
void f(int n)
{
    int tmp = 0;
    if(n == 13)
    {
        if(judge())
         ans++;
    }
    for(int i = n; i < 13; i++)
    {
        {tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯 
        f(n + 1);//递归 
        {tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯 
    }

}
int main()
{
    f(0);
    cout << ans;
    return 0;
}

//以上两段代码仅适合用于填空题(会超时)

代码优化

#include<iostream>

#include<bits/stdc++.h>

using namespace std;

int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13}; 

int ans;

bool judge()

{

  if(a[0] + a[1] == a[2] && a[3] - a[4] == a[5] && a[6] * a[7] == a[8] && a[9] % a[10] == 0 && a[9] / a[10] == a[11])

     return true;

  return false;

}

void f(int n)

{

  int tmp = 0;

  if(n == 13)

  {

    if(judge())

     ans++;

  }

  for(int i = n; i < 13; i++)

  {

    //全排列

    {tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯 

    if((n == 2 && a[0] + a[1] != a[2]) || (n == 5 && a[3] - a[4] != a[5]))

    {

      {tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯 

      continue;

    }

    f(n + 1);//递归 

    {tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯 

  }

}

int main()

{

    f(0);

  cout << ans;

  return 0;

}

本题总结

1.题目特征的总结

1.元素集合明确

2.不同排列顺序会产生不同结果,且都需要考虑

2.函数总结

next_permutation(起始位置,终点位置)、

作用:全排列

3.全排列模板总结

for(int i = 形参; i  < 最大值【这里的最大值看题意】; i++)

{
  {交换}

  函数名(形参 + 1);//递归

   {交换}//回溯

}

第七题

题目链接

题目解析

代码原理

特征识别: 1.元素唯一性2.顺序相关性

依据:

方法:全排列 

代码编写

代码一

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9};
int ans; 
bool judge()
{
    int x = a[3] * 100 + a[4] * 10 + a[5];
    int y = a[6] * 100 + a[7] * 10 + a[8]; 
    if((a[2] * x + a[1] * y) % (a[2] * y) == 0&& a[0] + (a[2] * x + a[1] * y) / (a[2] * y) == 10)
    return true;
    return false;
}
int main()
{
    do
    {
        if(judge())
        ans++;
    }while(next_permutation(a, a + 9));
    cout << ans;
    return 0;
 } 

代码二

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9};
int ans; 
bool judge()
{
    int x = a[3] * 100 + a[4] * 10 + a[5];
    int y = a[6] * 100 + a[7] * 10 + a[8]; 
    if((a[2] * x + a[1] * y) % (a[2] * y) == 0&& a[0] + (a[2] * x + a[1] * y) / (a[2] * y) == 10)
    return true;
    return false;
}
void f(int n)
{
    if(n == 9)
    {
        if(judge())
        ans++;
    }
    for(int i = n; i < 9; i++)
    {
        {int tmp = a[i]; a[i] = a[n]; a[n] = tmp;}
        f(n + 1);
        {int tmp = a[i]; a[i] = a[n]; a[n] = tmp;}
    }
}
int main()
{
    f(0);
    cout << ans;
    return 0;
 } 

本题总结

同第六题

本篇文章的内容就先到这里,我们下篇文章再见。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐