天天看點

藍橋杯真題——卡片藍橋杯真題——卡片

藍橋杯真題——卡片

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;
}
           

思路

  1. 設一個數組 a[10],代表數字 0 ~ 9 各有2021個
int a[10];
for(int i=0;i<=9;i++){
		a[i] = 2021;
	}
           
  1. 從1開始往後數,用過的數字,就把他減去1,比如用了數字1131,那麼數字1就剩下2021 - 3 = 2018 個了,數字3就剩下2021 - 1 = 2010 個了,但是其他數字沒變
藍橋杯真題——卡片藍橋杯真題——卡片
  1. 先拿每個數字的個位,然後将這個數字的剩餘數量減去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;
		}
	} 
           
  1. 臨界值判斷:當某個數字剩餘0的時候,還可以往下拼,直到再用到這個數字的時候,發現這個數字用不了了,這個時候能拼到的最大數字是目前數字的前一個.

    舉個例子,比如拼完數字199,發現數字1用完了,這個時候數字1的個數是0,但是數字200還可以拼,當拼到數字201的時候,發現數字1用完了,這個時候a[1]的值是負數了,是以這個時候循環結束了,而目前數字201的前一個數字200,才是我們要找的答案。

if(a[aa] < 0){
	cout<<num - 1<<endl;
	return 0; 
}
           
  1. 最後答案是

繼續閱讀