关于这个屑S组T1爆零这档事
  • 板块灌水区
  • 楼主引领天下魔酸
  • 当前回复19
  • 已保存回复19
  • 发布时间2020/11/10 22:13
  • 上次更新2023/11/5 08:18:11
查看原帖
关于这个屑S组T1爆零这档事
39863
引领天下魔酸楼主2020/11/10 22:13

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.

如果大样例能有哪怕一个数据干到我的边界,我也许就不会死的这么惨吧。算是吃了个“大样例过了就没锅了的亏”吧。

走了,衷心希望大家不要重蹈覆辙。

2020/11/10 22:13
加载中...