卡片问题(枚举与模拟)

 一:题目

题目信息
2021 年省赛-填空题
G C/C++ A 组第 1 题;C/C++ B 组第 2 题
G Java B 组第 2 题;Java C 组第 3 题
G Python 组第 1 题
【问题描述】
小蓝有很多数字卡片,每张卡片上都是一个数字(0 到 9)。
小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起
来,卡片就不能用来拼其他数了。
小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼
11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到
多少?
提示:建议使用计算机编程解决问题。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果作为一个整数,在
提交答案时只填写这个整数,填写多余的内容将无法得分。
小蓝有很多数字卡片,每张卡片上都必然刻有 0 ∼ 9 中的一个数字。
卡片可以用来拼凑数字,假设小蓝拥有刻有数字 1 和数字 2 的卡片各一张,那么他可以
利用这两张卡片拼凑出数字 1, 2, 12, 21 这 4 个正整数。
懒人速读
C/C++ 程序设计竞赛真题实战特训教程 (图解版)
现给定刻有数字 0, 1, . . . , 9 的卡片各 2021 张,小蓝将利用这些卡片从 1 开始连续拼凑
数字,请问他最大能拼到数字几(注意:每张卡片只能利用一次)?
题目分析
核心考点
G 枚举
G 模拟

二:个人代码

#include <stdio.h>
#include <string>
#include <iostream>

using namespace std;

int main(){

    int arr[10];

    int i;

    for(i=0;i<10;i++){
        arr[i]=2021;
    }

    i=1;
    int flag=0;
    int end;
    
    int jie_number;
  
    int number=0;
    int temp=number;
    while(flag==0){
        number++;
        temp=number;
         while(temp!=0){


            jie_number=temp%10;
            arr[jie_number]--;
            // 注意这里是-1而且是arr 不要漏掉arr
            if(arr[jie_number]==-1){
                end=number-1; //注意end是number-1因为到number是拼不到,注意这些小细节
                flag=1;
                break;
            }
            temp=temp/10;
        
        }
        

    }

    cout << end;
       
}

三:提升代码(只要考虑1的纸片就行了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值