藍橋杯真題——卡片
2021年省賽填空第一題
題目位址
https://www.lanqiao.cn/problems/1443/learning/
c++代碼:
//卡片
#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
for(int i=0;i<=9;i++){
a[i] = 2021;
}
int num =0;
while(1){
num++;
int temp = num;
while(temp != 0){
int aa = temp % 10;
a[aa]--;
if(a[aa] < 0){
// break;
cout<<num - 1<<endl;
return 0;
}
temp/=10;
}
// cout<<num<<endl;
}
// cout<<num<<endl;
return 0;
}
思路
- 設一個數組 a[10],代表數字 0 ~ 9 各有2021個
int a[10];
for(int i=0;i<=9;i++){
a[i] = 2021;
}
- 從1開始往後數,用過的數字,就把他減去1,比如用了數字1131,那麼數字1就剩下2021 - 3 = 2018 個了,數字3就剩下2021 - 1 = 2010 個了,但是其他數字沒變
- 先拿每個數字的個位,然後将這個數字的剩餘數量減去1,然後整除10,再拿個位數字,直到這個數字被整除到0為止,然後取下一個數字
int num =0;
while(1){
num++;
int temp = num;
while(temp != 0){
int aa = temp % 10;
a[aa]--;
if(a[aa] < 0){
cout<<num - 1<<endl;
return 0;
}
temp/=10;
}
}
-
臨界值判斷:當某個數字剩餘0的時候,還可以往下拼,直到再用到這個數字的時候,發現這個數字用不了了,這個時候能拼到的最大數字是目前數字的前一個.
舉個例子,比如拼完數字199,發現數字1用完了,這個時候數字1的個數是0,但是數字200還可以拼,當拼到數字201的時候,發現數字1用完了,這個時候a[1]的值是負數了,是以這個時候循環結束了,而目前數字201的前一個數字200,才是我們要找的答案。
if(a[aa] < 0){
cout<<num - 1<<endl;
return 0;
}
- 最後答案是