跳过正文
题解:AT_past202203_e 良い日付

题解:AT_past202203_e 良い日付

xyx404
作者
xyx404
Have a nice day.

思路:
#

暴力枚举直到现在的日期满足出现过的数字为 $2$ 种及以下。

注意当月份和天数小于 $10$ 时,需要在前面补一个 $0$,而这个 $0$ 也是需要算进出现过的数字种数里的。

统计出现过的数字种数可以使用 unordered_set,这是基于哈希表实现的无序关联容器,不会有重复的元素。

至于每月天数可以做下洛谷的这题

代码:
#

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int y,m,d,tamp;
char fuh;
unordered_set<int>se;
int day(int y,int m){
	if(m==2){
		if(y%4==0&&y%100!=0)return 29;
		else if(y%400==0)return 29;
		else{
			return 28;
		}
	}
	if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)return 31;
	else if(m==4||m==6||m==9||m==11)return 30;
}
bool check(){
	unordered_set<int>s;
	int tamp=y;
	if(m<10||d<10)s.insert(0);
	while(tamp){
		s.insert(tamp%10);
		tamp/=10;
	}
	tamp=m;
	while(tamp){
		s.insert(tamp%10);
		tamp/=10;
	}
	tamp=d;
	while(tamp){
		s.insert(tamp%10);
		tamp/=10;
	}
	if(s.size()<=2){
		return 1;
	}
	return 0;
}
int main(){
	cin>>y>>fuh>>m>>fuh>>d;
	tamp=y;
	if(m<10||d<10)se.insert(0);
	while(tamp){
		se.insert(tamp%10);
		tamp/=10;
	}
	tamp=m;
	while(tamp){
		se.insert(tamp%10);
		tamp/=10;
	}
	tamp=d;
	while(tamp){
		se.insert(tamp%10);
		tamp/=10;
	}
	if(se.size()<=2){
		printf("%d/%02d/%02d",y,m,d);
//		cout<<y<<"/"<<m<<"/"<<d;
	}
	else{
		while(1){
			if(d-1==day(y,m)){
				d=1;m++;
			}
			if(m==13){
				y++;m=1;
			}
			if(check()){
				printf("%d/%02d/%02d",y,m,d);//cout<<y<<"/"<<m<<"/"<<d;
				break;
			}
			d++;
		}
	}
	cout<<"\n";
	return 0;
}