P2010 [NOIP2016 普及组] 回文日期 题解

17 篇文章 0 订阅

Step 1 题目理解

  • 给你两个日期 s t a r t d a t e start_{date} startdate e n d d a t e end_{date} enddate 问你其中有多少个回文日期
  • 对回文日期的定义是形如 a b c d d c b a abcddcba abcddcba 的八位数日期

Step 2 做法解析

Step 2.1 做法1

  1. 考虑枚举在 s t a r t d a t e start_{date} startdate e n d d a t e end_{date} enddate 之间的所有日期,并判断是否为回文日期
  2. 时间复杂度约为 O ( 365 × 9000 × 8 ) = O ( 2.628 × 1 0 7 ) O(365 \times 9000 \times 8) = O(2.628 \times 10^7) O(365×9000×8)=O(2.628×107) (此处忽略了闰年)
  • 该做法是我口糊的,并没有写代码,所以就不贴了,理论可行

Step 2.2 做法2

  1. 由于每一个年份都只对应一个回文日期,所以可以枚举从 1000 1000 1000 9999 9999 9999 年之间的所有日期
  2. 判断是否在合法范围之内并且日期是否日期是否合法,如果是,就将 a n s + + ans++ ans++
  3. 时间复杂度 O ( 9000 × 8 ) = O ( 72000 ) O(9000 \times 8) = O(72000) O(9000×8)=O(72000)

Step 3 AC code

#include<bits/stdc++.h>
#define ll long long

using namespace std;

int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int a,b,ans = 0;
	cin >> a >> b;
	for(int i = 1000; i <= 9999; i++){
		int q = i * 10000 + (i % 10) * 1000 + ((i / 10) % 10) * 100 + ((i / 100) % 10) * 10 + (i / 1000);
		if(((((i % 10) * 10 + ((i / 10) % 10)) == 1 )|| (((i % 10) * 10 + ((i / 10) % 10)) == 3 )||(((i % 10) * 10 + ((i / 10) % 10)) == 5 )||(((i % 10) * 10 + ((i / 10) % 10)) == 7 ) ||(((i % 10) * 10 + ((i / 10) % 10)) == 8 )||(((i % 10) * 10 + ((i / 10) % 10)) == 10 )||(((i % 10) * 10 + ((i / 10) % 10)) == 12 ) )&&((((i / 100) % 10) * 10 + (i / 1000)) <= 31))
			if(a <= q && q <= b)  {ans++;}
		if(((((i % 10) * 10 + ((i / 10) % 10)) == 4 )||(((i % 10) * 10 + ((i / 10) % 10)) == 6 )||(((i % 10) * 10 + ((i / 10) % 10)) == 9 ) ||(((i % 10) * 10 + ((i / 10) % 10)) == 11 )) &&((((i / 100) % 10) * 10 + (i / 1000)) <= 30))
			if(a <= q && q <= b)  {ans++;}
		if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)){
			if((((i % 10) * 10 + ((i / 10) % 10)) == 2 ) && ((((i / 100) % 10) * 10 + (i / 1000)) <= 29))
				if(a <= q && q <= b)  {ans++;}
		}
		else{
			if((((i % 10) * 10 + ((i / 10) % 10)) == 2 ) && ((((i / 100) % 10) * 10 + (i / 1000)) <= 29))
				if(a <= q && q <= b)  {ans++;}
		}	
	}
	cout << ans << "\n";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值