为什么样例都过不了的题解AC了?
查看原帖
为什么样例都过不了的题解AC了?
344382
lmrttx楼主2021/2/15 22:04

题解

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*f;
}
inline ll readll(){
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*f;
}

const int dom[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int y=-4737,m=1,d=1;
int isRUN(int y){
	if(y<=0){
		y=-y;
		return y%4==1;
    }
	if(y<=1582)return y%4==0;
	return (y%400==0)||((y%4==0)&&(y%100!=0));
}
void getnxtday(){
	d++;
	if(y==1582&&m==10&&d==5)d=15;
	if(d>dom[m]+(m==2&&isRUN(y)))m++,d=1;
	if(m>12)y++,m=1;
}
ll checkday(int x){
	ll day=1ll*(x+4712)*365;
	if(x>1582)day-=10;
	day+=1ll*(x+4712+3)/4;
	if(x>=1600){
		x-=1601;
		day-=(ll)x/100ll;
		day+=(ll)x/400ll;
	}
	return day;
}
int main(){
	int T;
	T=read(); 
	while(T--){
		y=0;m=d=1;
		ll n=readll();
		int l=-4712,r=1e9+1;
		while(l<=r){
			int mid=(l+r)/2;
			if(checkday(mid)<=n){
				y=mid;
				l=mid+1;
			}else r=mid-1;
		}
		n-=checkday(y);
		if(y<=0)y--;
		while(n--)getnxtday();
		printf("%d %d ",d,m);
		if(y<=0)printf("%d BC\n",-y);
	    else printf("%d\n",y);
	}
	return 0;
}

样例2过不了

我按他的写法,样例二和他输出一样

我只有40分

我的代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int y=-4737,m=1,d=1,T;
ll n;
int check(int y){
	if(y<=0){y=-y;return y%4==1;}
	if(y<=1582)return y%4==0;
	return (y%400==0)||((y%4==0)&&(y%100!=0));
}
void get(){
	d++;
	if(y==1582&&m==10&&d==5)d=15;
	if(d>mon[m]+(m==2&&check(y)))m++,d=1;
	if(m>12)y++,m=1;
}
ll checkday(int x){
	ll day=(ll)(x+4712)*365;
	if(x>1582)day-=10;
	day+=(ll)(x+4712+3)/4;
	if(x>=1600){
		x-=1601;day-=(ll)x/10011;day+=(ll)x/40011;
	} 
	return day;
}
int main() {
	scanf("%d",&T);while(T--){
		y=0;m=d=1;
		scanf("%lld",&n);
		int l=-4712,r=1e9+1;
		while(l<=r){
			int mid=(l+r)/2;
			if(checkday(mid)<=n){
				y=mid;l=mid+1;
			}else r=mid-1;
		}
		n-=checkday(y);
		if(y<=0)y--;
		while(n--)get();
		printf("%d %d ",d,m);
		if(y<=0)printf("%d BC\n",-y);
		else printf("%d\n",y);
	}
	return 0;
}

我不想刷AC和抄题解,只是对此不解

我感觉他的做法没有问题

求助,谢谢

2021/2/15 22:04
加载中...