2020浙江省赛 A - AD 2020 打表+前缀和

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020浙江省赛 A - AD 2020 打表+前缀和相关的知识,希望对你有一定的参考价值。

原题
题意:给出两个日期,求这两个日期之间有202这个字符串的天的个数。
题解:打表+前缀和。

ps:稍微计算一下,打表的话会计算7e3 x 10 x 30=2e6次,刚好可以。
注意:要判断闰年。

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define fir(i,a,n) for(int i=a;i<=n;i++)
const int N=1e5+10;
int n;
/*
202x xx xx
x202 xx xx
xxx2 02 xx
xxxx x2 02
*/
int a[8050][15][40];// i-2000 j k
int day[13]=0,31,29,31,30,31,30,31,31,30,31,30,31;
int run(int i)

	if((i%400==0||i%4==0)&&i%100!=0) return 1;
	else return 0;

int ju(int x)

	string a=to_string(x);
	string f="202";
	int temp=a.find(f,0);
	if(temp==-1) return 0;
	else  return 1;	

void solve()

	int last=0;
	for(int i=2000;i<=9999;i++)
	
		for(int j=1;j<=12;j++)
		
			for(int k=1;k<=day[j];k++)
			
				if(j==2&&k==29&&!run(i)) continue;
				
				int temp=i*10000+j*100+k;
				
				if(ju(temp)) a[i-2000][j][k]=last+1;
				else a[i-2000][j][k]=last;
				last=a[i-2000][j][k];
			
		
	

int main()

	int t;cin>>t;
	solve();	
	while(t--)
	
		int y,m,d,yy,mm,dd;
		scanf("%d%d%d%d%d%d",&y,&m,&d,&yy,&mm,&dd);
		int ans=a[yy-2000][mm][dd]-a[y-2000][m][d];
		int temp=y*10000+m*100+d;
		if(ju(temp)) ans++;
		cout<<ans<<endl;
	
	return 0;

以上是关于2020浙江省赛 A - AD 2020 打表+前缀和的主要内容,如果未能解决你的问题,请参考以下文章

ZJCPC2020 第17届 浙江省赛The 17th Zhejiang Provincial Collegiate Programming Contest(ABCIK 5题)

2019年浙江省赛 I Fibonacci in the Pocket

2021年浙江信奥第二轮分数

4/23 18届浙江省赛

2020年2月2日 ICPC2019徐州 现场赛C <3 numbers 思维题

比赛题解 更新ING