第十四届蓝桥杯三月真题刷题训练——第 4 天

题目 1 :9数算式

知识点:

stoi()函数:

定义:

作用是将 n 进制的字符串转化为十进制,使用时包含头文件string.

语法:

int stoi( const std::string& str, std::size_t* pos = nullptr, int base = 10 );

参数:

str - 待转换的字符

pos - 其取值可以是一个空字符,在这种情况下,pos未被使用;另外如果pos不是空指针,函数将pos的值设置为str中数字后面的第一个字符的位置。

base - 字符中数字的进制,默认为10进制,如果base取值为0,则进制由字符串中的格式决定。

substr()函数:

定义:

substr()是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。

语法:

substr(size_type _Off = 0,size_type _Count = npos)

参数:

pos:开始位置

len:结束位置

形式 : s.substr(pos, len)

返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)

to_string()函数:

定义:

将数字常量转换为字符串,返回值为转换完毕的字符串

语法:

to_string(int n)

参数:

n:数字常量

next_permutation()函数:

定义:

两个用来计算排列组合关系的算法,按字典序全排列

语法:

next_permutation(str.begin(), str.end())

参数:

str.begin():字符串起点

str.end():字符串终点

参数也可为数组类型,第一个参数为数组的起点,第二个参数为数组的终点

思路:

对数字1-9的所有可能组合进行全排列,然后对得出的结果进行判断;因为调换除数的位置算一种做法,因此第一位除数仅需要枚举到第四位数位即可,再往后枚举会得到除数位置调换的结果

代码:

#include
using namespace std;
int ans;
//判断结果是否由1-9每一位数字组成 
bool check(int n)
{
    int vis[10] = {0};
    while(n>0)
    {
        vis[n%10]++;
        n/=10;
    } 
    for(int i=1;i<10;i++)
    {
        if(!vis[i])
            return false;
    }
     return true;
} 
int main()
{

    string str = "123456789";
    do
    {
        for (int i = 1; i <= 4; i ++ )
        {
//            将前i数字转换为十进制,因为调换顺序算一个算式,因此只用枚举到4即可 
            int a = stoi(str.substr(0, i));
            int b = stoi(str.substr(i, 100));
//          计算结果,并判断结果 是否符合规范 
            if(check(a*b))   ans++;        
        }
    }while(next_permutation(str.begin(), str.end()));//全排列枚举可能性 
    cout << ans;
}

题目2:山

思路:暴力;因为题目要求是回文,所以仅需要考虑左半部分即可,右半部分直接对称,不做考虑。分奇偶分别进行判断,注意题目要求的是单调不减,因此每一位数字完全相同的情况也算合法情况。

#include 
using namespace std;
//偶数位数据范围
const int LL = 22, RR = 19999;  
//奇数位数据范围,奇数位单调的最大数位为9位,因此因构造五位的单调不减序列       
const int LLL = 111, RRR = 99999;    
//判断是否单调不减 
bool check(int x) {
    //判断是否为第一位数
    int t = -1;
    while (x) {
        if (t != -1 && t < x % 10) return false;
        t = x % 10;
        x /= 10;
    }
    return true;
}
int main() {
    int ans = 0;
//    偶数位 
    for (int i = LL; i <= RR; ++i) {
        if (check(i)) ans++;
    }
//    奇数位 
    for (int i = LLL; i <= RRR; ++i) {
        if (check(i)) ans++;
    }
    cout << ans;
}

题目3:最少刷题数

思路:找到目标刷题数

#include 
#include 
const int maxn=1e5+10;
using namespace std;
int a[maxn], b[maxn];
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        b[i] = a[i];
    }
    sort(b + 1, b + n + 1);
    // 满足条件的目标刷题数
    int ans = -1; 
    //该目标数的位置 
    int index = 0; 
    for (int i = 1; i <= n && ans == -1; ) {
        index = i++;
        // 移动i指针,跳过相同分数的人
        while (i <= n && b[i] == b[i - 1]) i++; 
        //比较两侧人数
        int l = index - 1, r = n - i + 1; 
        if (l < r) continue;
        else if (l > r) ans = b[index];
        // 左边等于右边的情况下,多做一道题才能满足条件
        else ans = b[index] + 1; 
    }
    for (int i = 1; i <= n; i++) {

        if (a[i] < b[index])cout << ans - a[i] << " ";
        else cout<<0<<" ";
    }
}

你可能感兴趣的:(蓝桥杯,蓝桥杯,算法,职场和发展)