山东大学考研机试——Acwing3718. 插入乘号

给定一个长度为 n的数字串,向里面插入 k个乘号,输出可以得到的最大结果。

注意:插入乘号之后的每个数可以有前导0。

输入格式

第一行输入两个整数 n,k。

第二行输入长度为 n的一个数字序列。

输出格式

输出可以得到的最大结果。

数据范围

1≤k<n≤10

样例

4 2
1234

输出

144

分析

本题的数字的长度是10,每个数字之间的间隔共有9个,每个间隔有放与不放两种可能性,则共有2^9种情况所以使用最暴力的方法依次进行枚举即可,又要注意这种对于一串字符串的不同位置我们可以使用二进制枚举的方法,具体可以参考这里

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

int main()
{
    int n, m;
    string s;

    cin >> n >> m >> s;

    LL res = 0;

    int cnt = n - 1;//共有n-1个位置可以插入乘号
    for (int i = 0; i < 1 << cnt; i ++ )
    {
        int t = 0;
        for (int j = 0; j < cnt; j ++ )
            t += i >> j & 1;//i的第j位是不是1,想当于把任意个乘号任意的插入字符串的过程全部枚举了一遍
        if (t == m)
        {
            LL p = 1;
            string str = s.substr(0, 1);
            for (int j = 0; j < cnt; j ++ )
                if (i >> j & 1)//说明在该位置上的数与前一个位置上的数之前有乘号
                {
                    p *= stoll(str);//能将string类型转化为longlong型的整数
                    str = s.substr(j + 1, 1);//再将下一个位置上的数加入到新的字符串中
//为什么此处必须使用substr函数来截取乘号后面的那个字符而不能直接使用str=s[j+1]:因为s[j+1]的类型是char
                }
                else
                {
                    str += s[j + 1];
                }
            p *= stoll(str);
            res = max(res, p);//更新答案
        }
    }

    cout << res << endl;
    return 0;
}
posted @ 2023-07-16 15:34  liuwansi  阅读(105)  评论(0)    收藏  举报