【NOIP2016普及组】 second 枚举 date

    由于各种各样的缘故,题目无法放上来,看看洛谷里的原题目吧……


    NOIP2016普及组-回文日期-洛谷


    这道题乍一看就觉得很简单,非常容易就能想到用枚举即可,但是还是有几丝顾虑——一天一天枚举会不会爆?我也如此想着,所以想到了一个机(zuo)智(si)的方法——一年一年加(一年最多只会有一个回文),判断合法性即可。如:

    什么某年的回文月份与日份不匹配(13200231),月份日份明显超标或不达标(20000002,53100135)(闰年什么的怎么可能不考虑……)

    然后我突然发现一个问题:比如说这种数据——2011 01 01~2011 11 01(为方便你们打上空格),这样只有一年,而这年的回文是2011 11 02,虽然合法,但不在区间内,也不能算。所以就多花一点时间判断一下吧!我这么想……

    但是现实打击了我,我只判断了结束年是否合法,忘记了判断开始年,所以——

    2010 01 01~2011 11 01

    只有一个回文——2010 01 02,而我却会有两个——2010 01 02和2011 11 02

    哭晕在厕所……

    不过呢——由于民间数据太水,我的程序还是AC了,不过官方数据应该会有坑我的那种……只能自求多福了……

    就知道你们会要代码:

#include<cstdio>
int s1,s2;
int day[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int sy,sm,sd,ey,em,ed,sum;
int f(int a)
{
	return a%10*10+a/10;
}
int r()
{
	if(sm!=2)
		return 0;
	else
		return (sy%4==0&&sy%100)||sy%400==0;
}
int main()
{
	scanf("%d%d",&s1,&s2);
	sy=s1/10000;sm=s1/100%100;sd=s1%100;
	ey=s2/10000;em=s2/100%100;ed=s2%100;
	for(;sy<ey||(sy==ey&&sm<em)||(sy==ey&&sm==em&&sd<=ed);sd++)
	{
		if(sd>r()+day[sm])
		{
			sd=1;
			sm++;
		}
		if(sm>12)
		{
			sm=1;
			sy++;
		}
		if(f(sd)*100+f(sm)==sy)
		{
			sum++;
		}
		
	}
	printf("%d",sum);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值