链接:https://ac.nowcoder.com/acm/contest/216/A
来源:牛客网
题目描述
众所周知,小K是nowcoder的暴政苟管理,所以小K很擅长踢树,虽然本题与踢树无关
小K喜欢将日期排列成yyyy-mm-dd的形式(位数不足添零补齐)的形式,虽然这与小K只会做回文字符串这道水题无关,但小K觉得日期组成的回文串也是挺可爱的。作为一个凉心出题人,小K决定给你一个可爱的问题:给你两个日期,求这两个日期的闭区间内有多少个回文的日期(输入可能包含多组数据)
输入描述:
第一行包含一个整数T,表示有T组数据
接下来T行,每行两个“yyyy-mm-dd"形式的日期
输出描述:
输出共T行,每行输出当前数据的回文日期的个数
示例1
输入
复制
1
1926-08-16
2333-12-21
输出
复制
36
*******
学习到了格式化输入
scanf("%d-%d-%d",&x1,&y1,&z1); 竟然可以输入1928-08-26(前导0的数并保存)
题解就是枚举天数
但是往出抽年月日的时候,特别智障用for跑了年月日抽的每一位,导致超时三发...
其实可以直接O(1)用表达式求出来
int str[10];
str[0]=x1/1000;
str[1]=x1/100%10;
str[2]=x1/10%10;
str[3]=x1%10;
str[4]=y1/10;
str[5]=y1%10;
str[6]=z1/10;
str[7]=z1%10;
if(str[0]==str[7]&&str[1]==str[6]&&str[2]==str[5]&&str[3]==str[4])
sum++;
代码:
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<sstream>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000;
int main(){
int T;
cin>>T;
int x1=0,y1=0,z1=0;
int x2=0,y2=0,z2=0;
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
while(T--){
scanf("%d-%d-%d",&x1,&y1,&z1);
scanf("%d-%d-%d",&x2,&y2,&z2);
int sum=0;
int k;
while(1){
if((x1%4==0&&x1%100!=0)||(x1%400==0)){
arr[2]=29;
}
else
arr[2]=28;
if(z1>arr[y1]){
z1=1;
y1++;
}
if(y1>12){
x1++;
y1=1;
}
int str[10];
str[0]=x1/1000;
str[1]=x1/100%10;
str[2]=x1/10%10;
str[3]=x1%10;
str[4]=y1/10;
str[5]=y1%10;
str[6]=z1/10;
str[7]=z1%10;
if(str[0]==str[7]&&str[1]==str[6]&&str[2]==str[5]&&str[3]==str[4])
sum++;
if(x1==x2&&y1==y2&&z1==z2)
break;
z1++;
}
cout<<sum<<endl;
}
return 0;
}
以下代码被评论的一个朋友hack了 这组数据 1111-11-12 1111-11-12
牛客判题也水??
但是同学又给我一个核心代码五行的方法。。。。。。
枚举日和月,在组成的数(就是年)判断是否在给定的闭区间内
#include <bits/stdc++.h>
using namespace std;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int t;
scanf("%d", &t);
while(t--){
int ans = 0, y1, m1, d1, y2, m2, d2;
scanf("%d-%d-%d", &y1, &m1, &d1);
scanf("%d-%d-%d", &y2, &m2, &d2);
for(int i = 1; i < 13; i++){
for(int j = 1; j <= a[i]; j++){
int q = j%10*1000 + j/10*100 + i%10*10 + i/10;
if(q >= y1 && q <= y2){
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}