短数据输出正常,一长就有问题,有注释,求助
查看原帖
短数据输出正常,一长就有问题,有注释,求助
1016832
Lertoli楼主2023/11/11 19:41

第2到第8数据正确,但第一个有问题。 我试过样例三,数据长起来输出全是0。 不知道哪里的问题求教。 最后两个TLE可以先不管它。

/*
思路是先把所有的数据读入,按ri排序选最大的只进行一次数日期。
然后再按读入的顺序排序,再输出。
*/
#include<bits/stdc++.h>
using namespace std;
long long mo[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
long long d=1,m=1,y=4713;
struct q{
	long long ri,d,m,y,i;//分别为 多少天 是几号 几月 那一年 第几个输入
	bool k;//k判断是否为公元后 
}a[100010];
bool gongyuanhou=false; //是否为公元后 
bool run(int y) //判断闰月 
{
	if(gongyuanhou&&y>1582) return y%400==0||(y%4==0&&y%100!=0);
	else if(gongyuanhou) return y%4==0;
	else return (y-1)%4==0;
}
bool cmp1(q x,q y)//按数如的ri排序 
{
	return x.ri<y.ri;
}
bool cmp2(q x,q y)//按序号排序 
{
	return x.i<y.i;
}

int main()
{
	long long Q,t=0,num=1;
	scanf("%lld",&Q);
	for(int i=1;i<=Q;i++)
	{
		scanf("%lld",&a[i].ri);
		a[i].i=i;//记录为第几个输入的,以便待会输出 
	}
	sort(a+1,a+Q+1,cmp1);
	long long k=a[Q].ri;//k为ri中最大的,这样就只用数一次 
	while(t<k)
	{
		t++;
		if(y==1582&&gongyuanhou&&m==10&&d==4) d+=11;
		else d++;
		
		if(m==2&&run(y)) mo[2]=29;//闰月 
		else mo[2]=28;
		
		if(d>mo[m]) //月份进 
		{
			m++;d=1;
		}
		if(m>12)//年份进,分为公元前和公元后 
		{
			if(gongyuanhou)//公元后加年份 
			{
				y++;m-=12;
			}
			else//减年份
			{
				y--;m-=12;
			}
		}
		if(y==0)//减到0年了 
		{
			y++;gongyuanhou=true;
		}
		while(t==a[num].ri)//如果为对应的ri,记录。 
		{
			a[num].d=d;
			a[num].m=m;
			a[num].y=y;
			a[num].k=gongyuanhou;
			num++;
		}
	}
	sort(a+1,a+Q+1,cmp2);//按序号排回来 
	for(int i=1;i<=Q;i++)//输出 
	{
		if(a[i].k) printf("%lld %lld %lld\n",a[i].d,a[i].m,a[i].y);
		else printf("%lld %lld %lld BC\n",a[i].d,a[i].m,a[i].y);
	}
	return 0;
}

https://www.luogu.com.cn/record/134582393

2023/11/11 19:41
加载中...