c++2021年真题【口袋】

就是在写代码的时候,遇到了一些问题,有谁能帮忙改下
题目描述
克拉拉同学平时就喜欢一些奇奇怪怪的东西,她有一个神奇的口袋,她能从口袋里拿出各种神奇的东西。

某一天她发现口袋里出现了一些像数字形状的物品, 我们用 0 到 9 这十种数字来表示不同的物品。

克拉拉有一个非常喜欢的数字 x
, 现在她想用口袋里的给出的这些数字形状的物品来组成尽可能多的 x
,每个物品只能用一次。

组装过程中克拉拉发现这些像数字形状的物品中,“2” 和 “5”倒过来特别像,“6” 和 “9” 倒过来也特别像,所以她可以用 2 和 5 互相代替,也能用 6 和 9互相代替(其他的不能代替)。

举个例子,克拉拉喜欢数字 42,现在口袋里能拿出来顺序为 “23454” 这五种物品,因此她可以用第一个物品 “2” 和第三个物品 “4” 组成 42(可以组成 24,但不是需要的),还能用第四个物品 “5” 和第五个物品 “4" 组成 42(其中 5 倒过来可以当作 2 )。

现在想要知道这些物品最多能组成几个克拉拉最喜欢的数字。

请你编程帮克拉拉解决这个问题,并输出能用物品组成 x
的最多的个数。

输入描述
第一行为一个正整数 x
,表示克拉拉最喜欢的数字。

第二行为一个字符串,字符串每一位为‘0’ 到‘9’ 的某个字符,字符串长度为物品的个数(数字之间没有其他符号)。

输出描述
一行,一个整数,表示能用物品拼成最多的 x
的个数(拼成 x
的次数)。

样例
输入 复制
42
23454
输出 复制
2
输入 复制
169
21891919
输出 复制
1
输入 复制
801
12345678111
输出 复制
0

然后我的的代码是这样的

#include <bits/stdc++.h>
using namespace std;
int main(){
    string num;
    map <char, int> m;
    getline(cin, num);
    for(int i=0; i<num.size(); i++){
        if(num[i]=='5') num[i]='2';
        else if(num[i]=='2') num[i]='5';
        else if(num[i]=='6') num[i]='9';
        else if(num[i]=='9') num[i]='6';
        m[num[i]]++;
    }
    int ans=0;
    while(1){
        if(m['0']) m['0']--, ans++;
        else if(m['1']) m['1']--, ans++;
        else if(m['2']>=2) m['2']-=2, ans++;
        else if(m['3']) m['3']--, ans++;
        else if(m['4']) m['4']--, ans++;
        else if(m['5']>=2) m['5']-=2, ans++;
        else if(m['6']>=2) m['6']-=2, ans++;
        else if(m['7']) m['7']--, ans++;
        else if(m['8']) m['8']--, ans++;
        else if(m['9']>=2) m['9']-=2, ans++;
        else break;
    }
    cout<<ans<<endl;
    return 0;
}

引用 皆我百晓生 小程序回复内容作答:

你的代码基本上是正确的,但有一点需要修改。

在输入时,你使用了getline(cin, num)来获取字符串,这样会导致将第一行的整数作为字符串读入,而不是将其作为数字保存在num变量中。你应该改为使用cin >> num来获取整数。

修改后的代码如下:

#include <bits/stdc++.h>
using namespace std;
int main() {
    int num;
    map<char, int> m;
    cin >> num;
    string items;
    cin >> items;
    for (int i = 0; i < items.size(); i++) {
        if (items[i] == '5')
            items[i] = '2';
        else if (items[i] == '2')
            items[i] = '5';
        else if (items[i] == '6')
            items[i] = '9';
        else if (items[i] == '9')
            items[i] = '6';
        m[items[i]]++;
    }
    int ans = 0;
    while (true) {
        if (m['0'])
            m['0']--, ans++;
        else if (m['1'])
            m['1']--, ans++;
        else if (m['2'] >= 2)
            m['2'] -= 2, ans++;
        else if (m['3'])
            m['3']--, ans++;
        else if (m['4'])
            m['4']--, ans++;
        else if (m['5'] >= 2)
            m['5'] -= 2, ans++;
        else if (m['6'] >= 2)
            m['6'] -= 2, ans++;
        else if (m['7'])
            m['7']--, ans++;
        else if (m['8'])
            m['8']--, ans++;
        else if (m['9'] >= 2)
            m['9'] -= 2, ans++;
        else
            break;
    }
    cout << ans << endl;
    return 0;
}

希望对你有帮助!

【以下回答由 GPT 生成】

我可以解决这个问题。

首先,根据输入描述,我们可以将输入分为两部分:克拉拉最喜欢的数字x和口袋里的物品。

接下来,我们可以从输入中提取数字x和字符串物品,同时将2和5互相替换,将6和9互相替换,以便后续计算。

然后,我们可以创建一个map数据结构m来记录口袋里不同数字物品的个数。

接下来,我们需要编写一系列的if语句来根据题目要求逐步减少物品的个数并计算能够组成最多x的个数。具体的解题思路如下:

  1. 首先检查m中是否有0,如果有,减少其个数并将结果+1,继续下一步;
  2. 如果没有0,再检查是否有1,如果有,减少其个数并将结果+1,继续下一步;
  3. 然后检查是否有2的个数大于等于2,如果是,减少2个2的个数并将结果+1,继续下一步;
  4. 然后依次检查是否有3、4、5、6、7、8的个数大于0,如果有,减少其个数并将结果+1,继续下一步;
  5. 最后检查是否有9的个数大于等于2,如果是,减少2个9的个数并将结果+1,继续下一步;
  6. 如果以上步骤都未满足,结束循环。

最后,我们输出结果。

下面是完整的解决方案:

#include <iostream>
#include <map>
using namespace std;

int main(){
    string num;
    map<char, int> m;
    getline(cin, num);
    for(int i=0; i < num.size(); i++){
        if(num[i] == '5') num[i] = '2';
        else if(num[i] == '2') num[i] = '5';
        else if(num[i] == '6') num[i] = '9';
        else if(num[i] == '9') num[i] = '6';
        m[num[i]]++;
    }

    int ans = 0;
    while(true){
        if(m['0']) m['0']--, ans++;
        else if(m['1']) m['1']--, ans++;
        else if(m['2'] >= 2) m['2']-=2, ans++;
        else if(m['3']) m['3']--, ans++;
        else if(m['4']) m['4']--, ans++;
        else if(m['5'] >= 2) m['5']-=2, ans++;
        else if(m['6'] >= 2) m['6']-=2, ans++;
        else if(m['7']) m['7']--, ans++;
        else if(m['8']) m['8']--, ans++;
        else if(m['9'] >= 2) m['9']-=2, ans++;
        else break;
    }
    cout << ans << endl;
    return 0;
}

你可以运行这段代码并替换输入来测试结果。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^