题解:AT_past202203_e 良い日付

封面

思路:

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

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

统计出现过的数字种数可以使用 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;
}