【杭电】[1201]18岁生日

文章字数:560

问题描述

问题分析

关于这一题的初次见面感想:
【算法】算法是一种思维

这一题当时因为怕超时 所以并没有用循环
(想想才只需要循环18次 怎么会超时……)

于是写出了这样的一个代码:
(多次WA)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
int run(int m) {
	if(m%100==0) {
		if(m%400==0)
			return 1;
		else return 0;
	} else if(m%100!=0&&m%4==0)
		return 1;
	else
		return 0;
}
int main() {
	int T,y,m,d;
	int t;
	scanf("%d",&T);
	while(T--) {
		scanf("%d-%d-%d",&y,&m,&d);
		if(m==2&&d==29) {
			printf("-1\n");
		} else if(run(y))
			if(m<=2)
				printf("6575\n");
			else
				printf("6574\n");
		else if(run(y+1))
			printf("6575\n");
		else if(run(y+2))
			if(m<=2)
				printf("6574\n");
			else
				printf("6575\n");
		else if(run(y+3))
			printf("6574\n");
	}
	return 0;
}

这种写法的前提是 闰年每四年一次
然后这样只需要判断 当前年与后一年 后两年 后三年是否是闰年 便可以来分情况思考直接输出结果了
毕竟答案只有 6574或者6575
然而闰年并非严格4年1次
百年不设闰 四百年设一闰

所以思路假设前提就是错的 导致了代码出错
于是决定老老实实地用循环来做:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
int run(int m) {
	if((m%400==0)||(m%100!=0&&m%4==0))
		return 1;
	else
		return 0;
}
int main() {
	int T,y,m,d;
	scanf("%d",&T);
	while(T--) {
		scanf("%d-%d-%d",&y,&m,&d);
		int sum=0;
		if(m==2&&d==29) {
			printf("-1\n");
		} else {
			if(m<=2) {
				for(int i=0; i<18; i++) {
					if(run(y++))
						sum+=366;
					else
						sum+=365;
				}
			} else {
				for(int i=0; i<18; i++) {
					if(run(++y))
						sum+=366;
					else
						sum+=365;
				}
			}
			printf("%d\n",sum);
		}
	}
	return 0;
}
//用循环很轻松就AC了
//当时为什么脑抽坚持直接判定呢……
//有时候太强不是好事啊
//对代码简洁的强迫症有时候真难办
//一会再看看我那个代码究竟是错在哪里了 
//(现在知道还是闰年的关系)

同时顺手改了一下判定闰年的if语句
让它看起来更舒服了一些

题目地址:【杭电】[1201]18岁生日

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

加载中...