社区讨论
分享一个优化的方法
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 条回复,欢迎继续交流。
正在加载回复...