第十二届蓝桥杯 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;
}