社区讨论

分享一个优化的方法

P7075[CSP-S 2020] 儒略日参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lz857rvj
此快照首次捕获于
2024/07/30 16:15
2 年前
此快照最后确认于
2024/07/30 16:59
2 年前
查看原帖
89-95行,如果思路不清晰可以纯模拟+优化,速度快而且很好写
后几个测试点速度比正解慢不少但可以接受
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int T;
ll a;
int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld",&a);a++;
		if(a<=1721424)//公元前 
		{
			int k=4713;
			while(a>366||a>365&&(k-1)%4!=0)
			{
				if((k-1)%4==0)a-=366;
				else a-=365;
				k--;
			}
			if((k-1)%4==0)month[2]++;
			int l=1;
			while(a>month[l])
			{
				a-=month[l];
				l++;
			}
			printf("%lld %d %d BC\n",a,l,k);
			if((k-1)%4==0)month[2]--;
		}
		else if(a>1721424&&a<=2299161)//1 1.1-1582 10.4
		{
			a-=1721424;
			int k=1;
			while(a>366||a>365&&k%4!=0)
			{
				if(k%4==0)a-=366;
				else a-=365;
				k++;
			}
			if(k%4==0)month[2]++;
			int l=1;
			while(a>month[l])
			{
				a-=month[l];
				l++;
			}
			printf("%lld %d %d\n",a,l,k);
			if(k%4==0)month[2]--;
		}
		else if(a>2299161&&a<=2299239)//1582 10.4-1582 12.31
		{
			a+=14;
			a-=2299161;
			int k=1582;
			int l=10;
			while(a>month[l])
			{
				a-=month[l];
				l++;
			}
			printf("%lld %d %d\n",a,l,k);
		}
		else if(a>2299239&&a<=2305813)//1583-1600 
		{
			a-=1721424;a+=10;a-=12;//加上消失的十天,减掉多加的闰年 
			int k=1;
			while(a>366||a>365&&!(k%4==0&&k%100!=0||k%400==0))
			{
				if(k%4==0&&k%100!=0||k%400==0)a-=366;
				else a-=365;
				k++;
			}
			if(k%4==0&&k%100!=0||k%400==0)month[2]++;
			int l=1;
			while(a>month[l])
			{
				a-=month[l];
				l++;
			}
			printf("%lld %d %d\n",a,l,k);
			if(k%4==0&&k%100!=0||k%400==0)month[2]--;
		}
		else
		{
			a-=1721424;a+=10;a-=12;//加上消失的十天,减掉多加的闰年 
			int k=1;
			while(a>365242500){a-=365242500;k+=1000000;}//不要脸的优化 
			while(a>182621250){a-=182621250;k+=500000;}
			while(a>36524250){a-=36524250;k+=100000;}
			while(a>18262125){a-=18262125;k+=50000;}
			while(a>3652425){a-=3652425;k+=10000;}
			while(a>730485){a-=730485;k+=2000;}
			while(a>146097){a-=146097;k+=400;}
			while(a>366||a>365&&!(k%4==0&&k%100!=0||k%400==0))
			{
				if(k%4==0&&k%100!=0||k%400==0)a-=366;
				else a-=365;
				k++;
			}
			if(k%4==0&&k%100!=0||k%400==0)month[2]++;
			int l=1;
			while(a>month[l])
			{
				a-=month[l];
				l++;
			}
			printf("%lld %d %d\n",a,l,k);
			if(k%4==0&&k%100!=0||k%400==0)month[2]--;
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...