洛谷题解洛谷题解题解:AT_past202203_e 良い日付
xyx404
思路:
暴力枚举直到现在的日期满足出现过的数字为 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);
} 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); break; } d++; } } cout<<"\n"; return 0; }
|