第十二届蓝桥杯 2021 C/C++组 卡片
目录
题目:
题目描述:
题目链接:
思路:
思路详解:
代码:
代码详解:
题目:
题目描述:

题目链接:
卡片 - 蓝桥云课
思路:
思路详解:
由题给出0到9的卡片个2021张,后续拼数不成功的情况其实就是某个数字的卡片数量不够。所以我们可以先打表记录0到9的卡片的剩余数量(即int a[10],索引就代表卡片上的数字)。我先自己定义了一个索引ans表示当前在拼的数,ans从1开始。下面就是正式模拟题意过程,先写一个while(1)的无限循环,每次用临时变量temp记录此时ans的值。先假设目前这个数是拼的出来的,然后把temp逐位拆解,每次拆出来一位数就把数组a中记录的相应卡片数-1.在把temp全部拆解完之后,遍历a数组看是否存在某个数字的卡片<0,只要存在一个数字的卡片<0就表明目前这个ans拼不出来同时标记为false。在循环的最后,判断flag是true还是false,如果是true就ans++继续拼下一个数,如果是false,就直接break退出循环
这里还是有一个小细节要注意,退出时的ans是第一个拼不出来的数,题目问最大能拼到哪个数,所以正确答案是ans-1,填空题还是要注意细节,答案错了就直接没分了
代码:
代码详解:
#include<bits/stdc++.h>  //填空题,正确答案是3181,题目逻辑不是很难但是细节问题还是容易出错 
using namespace std;     //这题我一开始没注意细节输出的是3182就错了 int main()
{int ans=1;  //ans表示的是当前在拼的数 int a[10]={2021,2021,2021,2021,2021,2021,2021,2021,2021,2021};while(1){int temp=ans;  //ans表示的是当前在拼的数,用临时变量temp来存 while(temp!=0)  //temp!=0表示temp还没有被完全删完,这个while过程表示把temp的每一位拆出来 {a[temp%10]--; //把当前temp的最后一位的卡片数减1 temp/=10;     //删去temp的最后一位 } bool flag=true;   //先标记这个ans能拼出来for(int i=0;i<10;i++)  //遍历所有数字的卡片数 {if(a[i]<0)    //如果拼完ans这个数存在某个卡片数<0,说明ans拼不出来 {flag=false;  //标记这个ans拼不出来 break;       //只要存在一个卡片数<0就拼不出来,直接退出 }}if(flag==true)  //如果能拼出来就尝试下一个数,即ans++ {ans++;}else            //如果拼不出来就直接break退出 {break;}}cout<<ans-1<<endl;  //注意:退出时的ans是第一个拼不出来的数,题目问最大能拼到哪个数//所以正确答案是ans-1,填空题还是要注意细节,答案错了就直接没分了 return 0;
}