RT
考后根据测试数据调对的代码:
#include<bits/stdc++.h>
using namespace std;
int t,cnt;
long long r;
const int runmonth[]={0,31,29,31,30,31,30,31,31,30,31,30,31},pingmonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
pair<int,int>runyear[370],pingyear[370],gr[370],gp[370];
char c;
template<typename _Tp>
inline void read(_Tp&x){
x=0;c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
}
void write(int n){
if(n<10){putchar(n+'0');return;}
write(n/10);
putchar(n%10+'0');
}
inline void write(int a,int b,int c){write(a),putchar(' '),write(b),putchar(' '),write(c);}
inline void writeBC(int a,int b,int c){write(a,b,c),putchar(' '),putchar('B'),putchar('C');}
int main(){
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
cnt=-1;
for(int i=1;i<=12;i++)
for(int j=1;j<=runmonth[i];j++)runyear[++cnt]=make_pair(i,j);
cnt=-1;
for(int i=1;i<=12;i++)
for(int j=1;j<=pingmonth[i];j++)pingyear[++cnt]=make_pair(i,j);
int month=10,day=15,cnt=-1;
while(++cnt<366){
gr[cnt]=make_pair(month,day);
day++;
if(day>runmonth[month])day=1,month++;
if(month>12)month=1;
}
month=10,day=15,cnt=-1;
while(++cnt<365){
gp[cnt]=make_pair(month,day);
day++;
if(day>pingmonth[month])day=1,month++;
if(month>12)month=1;
}
/*cnt=0;
for(int i=1;i<=400;i++)if((i%4==0&&i%100!=0)||i%400==0)cnt+=366;else cnt+=365;
printf("%d\n",cnt);*/
read(t);
while(t--){
read(r);
if(r<1721424){//公元前
int year=4713-r/(365*3+366)*4;
//printf("%d ",year);
r%=(365*3+366);
if(r<366){//剩下的日子落在闰年里
writeBC(runyear[r].second,runyear[r].first,year);putchar('\n');
continue;
}else {//剩下的日子落在闰+平里
year-=1+(r-366)/365;r-=366;r%=365;
writeBC(pingyear[r].second,pingyear[r].first,year);putchar('\n');
continue;
}
}else if(r<=1721424+577736){//公元1.1.1~1582.10.4
r-=1721424;
int year=1+r/(365*3+366)*4;//365+365+365+366
r%=(365*3+366);
if(r<365*3){//平+平+平
year+=r/365;r%=365;
write(pingyear[r].second,pingyear[r].first,year);putchar('\n');
continue;
}else{
r-=365*3;year+=3+(r>365);
write(runyear[r].second,runyear[r].first,year);putchar('\n');
continue;
}
}else{//公元1582.10.15~inf
r-=1721424+577737;
int year=1582+r/146097*400;
r%=146097;
for(;r>=366;year++)if(((year+1)%4==0&&(year+1)%100!=0)||(year+1)%400==0)r-=366;
else r-=365;
if(r==365&&!(((year+1)%4==0&&(year+1)%100!=0)||(year+1)%400==0))year++,r=0;
if(r>=78)year++;
if((year%4==0&&year%100!=0)||year%400==0)write(gr[r].second,gr[r].first,year),putchar('\n');
else write(gp[r].second,gp[r].first,year),putchar('\n');
}
}
return 0;
}
考场代码:
#include<bits/stdc++.h>
using namespace std;
int t,r,cnt;
const int runmonth[]={0,31,29,31,30,31,30,31,31,30,31,30,31},pingmonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
pair<int,int>runyear[370],pingyear[370],gr[370],gp[370];
char c;
template<typename _Tp>
inline void read(_Tp&x){
x=0;c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
}
void write(int n){
if(n<10){putchar(n+'0');return;}
write(n/10);
putchar(n%10+'0');
}
inline void write(int a,int b,int c){write(a),putchar(' '),write(b),putchar(' '),write(c);}
inline void writeBC(int a,int b,int c){write(a,b,c),putchar(' '),putchar('B'),putchar('C');}
int main(){
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
cnt=-1;
for(int i=1;i<=12;i++)
for(int j=1;j<=runmonth[i];j++)runyear[++cnt]=make_pair(i,j);
cnt=-1;
for(int i=1;i<=12;i++)
for(int j=1;j<=pingmonth[i];j++)pingyear[++cnt]=make_pair(i,j);
int month=10,day=15,cnt=-1;
while(++cnt<366){
gr[cnt]=make_pair(month,day);
day++;
if(day>runmonth[month])day=1,month++;
if(month>12)month=1;
}
month=10,day=15,cnt=-1;
while(++cnt<365){
gp[cnt]=make_pair(month,day);
day++;
if(day>pingmonth[month])day=1,month++;
if(month>12)month=1;
}
/*cnt=0;
for(int i=1;i<=400;i++)if((i%4==0&&i%100!=0)||i%400==0)cnt+=366;else cnt+=365;
printf("%d\n",cnt);*/
read(t);
while(t--){
read(r);
if(r<1721424){//公元前
int year=4713-r/(365*3+366)*4-(r%(365*3+366))/365;
//printf("%d ",year);
r%=(365*3+366);
if(r<366){//剩下的日子落在闰年里
writeBC(runyear[r].second,runyear[r].first,year);putchar('\n');
continue;
}else {//剩下的日子落在闰+平里
r-=366;r%=365;
writeBC(pingyear[r].second,pingyear[r].first,year);putchar('\n');
continue;
}
}else if(r<=1721424+577736){//公元1.1.1~1582.10.4
r-=1721424;
int year=1+r/(365*3+366)*4+(r%(365*3+366))/365;//365+365+365+366
r%=(365*3+366);
if(r<365*3){//平+平+平
r%=365;
write(pingyear[r].second,pingyear[r].first,year);putchar('\n');
continue;
}else{
r-=365*3;
write(runyear[r].second,runyear[r].first,year);putchar('\n');
continue;
}
}else{//公元1582.10.15~inf
r-=1721424+577737;
int year=1582+r/146097*400;
r%=146097;
for(;r>=366;year++)if(((year+1)%4==0&&(year+1)%100!=0)||(year+1)%400==0)r-=366;
else r-=365;
if(r==365&&!(((year+1)%4==0&&(year+1)%100!=0)||(year+1)%400==0))year++,r=0;
if(r>=78)year++;
if((year%4==0&&year%100!=0)||year%400==0)write(gr[r].second,gr[r].first,year),putchar('\n');
else write(gp[r].second,gp[r].first,year),putchar('\n');
}
}
return 0;
}
改了3处,0->100.
如果大样例能有哪怕一个数据干到我的边界,我也许就不会死的这么惨吧。算是吃了个“大样例过了就没锅了的亏”吧。
走了,衷心希望大家不要重蹈覆辙。