题目简介:
世界上最遥远的距离
不是生与死
而是我就站在你面前
你却不知道我爱你
世界上最遥远的距离
不是我就站在你面前你却不知道我爱你
而是明明知道彼此相爱
却不能在一起
世界上最遥远的距离
不是明明知道彼此相爱却不能在一起
而是相约好了私奔的时间
我穿越到了未来 你却回去了古代
——摘自《小Q失恋日记 》第117卷513页
当小Q使出浑身解数,终于赢得HR女神芳心的时候,却出现了一个意外情况,那就是白富美HR的妈妈并不同意他们交往,当听说小Q只是一个码农,特别是听说小Q曾经参加过资本主义国家发起的SM/ICPC比赛的时候,更是坚决反对!
爱情是伟大的,但是得不到亲人祝福的爱情却备受折磨,小Q和HR相约在腾讯第二届编程马拉松大赛进行到第5天的时候(即2013年3月24日),一起“向前穿越D天,然后开启幸福新生活”。
其勇气可谓令人赞叹,但可怜的小Q却总是备受折磨——小Q理解的”向前穿越”是朝着未来的方向,而女友HR理解的“向前穿越”却是朝着古代的方向!
假设已知现在的日期和穿越的天数D,你能计算出小Q和女友各自到达的年代吗?
详细请见:http://acm.hdu.edu.cn/showproblem.php?pid=4515
分析:
这种类型的题目很多,大概都是给出一个天数,然后计算之前的几天的年月日时多少,我这次参加了蓝桥杯的区域赛的第一题就是这种类型的,可惜楼主当时不会啊,楼主当时用手指头一天一天的算出来的,说多了都是泪啊。好,言归正传,解题的基本思路是来模拟加一天和减一天,这种思路较为简单,但是效率不是太高。
废话少说,程序员都应该去代码的干活!八格牙路!
代码:
#include <stdio.h> #include <stdlib.h> int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; typedef struct { int year,month,day; }Day; Day day1,day2; //判断是不是闰年 int leap(int year) { if(year%400==0||(year%4==0&&year%100!=0)) return 1; return 0; } //获得某一个月份的天数值 int getdays(int year,int mymonth) { if(leap(year)&&mymonth==2) return 29; return month[mymonth-1]; } //向后添加一天 void addDay() { if(day1.day<getdays(day1.year,day1.month)) day1.day++; else{ day1.day=1; day1.month++; if(day1.month>12) { day1.month=1; day1.year++; } } } //向前添加一天 void subDay() { if(day2.day>1) day2.day--; else{ day2.month--; if(day2.month<=0) { day2.month=12; day2.year--; } day2.day=getdays(day2.year,day2.month); } } int main() { int n; scanf("%d",&n); int i; int j; int myDay; for(i=0;i<n;i++) { day2.year=day1.year=2013; day2.month= day1.month=3; day2.day=day1.day=24; scanf("%d",&myDay); for(j=0;j<myDay;j++) { addDay(); subDay(); } printf("%d/",day1.year); if(day1.month<10) printf("0%d/",day1.month); else printf("%d/",day1.month); if(day1.day<10) printf("0%d ",day1.day); else printf("%d ",day1.day); printf("%d/",day2.year); if(day2.month<10) printf("0%d/",day2.month); else printf("%d/",day2.month); if(day2.day<10) printf("0%d\n",day2.day); else printf("%d\n",day2.day); } return 0; }
上面代码是C语言版的,下面给出一个C++版的,C++版的思路更为清晰,但是我觉得还是C语言版的执行效率不较高,对于ACM比赛建议采用C语言。
#include <cstdlib> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int month[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool leap(int y) { return (y%4==0 && y%100!=0) || (y%400==0); } int getdays(int y, int m) { if (leap(y) && m == 2) return 29; return month[m]; } struct Data { int y, m, d; Data():y(2013),m(3),d(24){} const Data & sub(int days); const Data & add(int days); void show() const; }; void Data::show() const { printf("%04d/%02d/%02d", y, m, d); } const Data & Data::sub(int days) { // 每次减去一天 while (days--) { d -= 1; if (d == 0) { d += getdays(y, m-1); m -= 1; } if (m == 0) { m = 12; y -= 1; } } return *this; } const Data & Data::add(int days) { while (days--) { d += 1; if (leap(y)&&m==2&&d==29) {} else if (d > month[m]) { d = 1; m += 1; } if (m == 13) { m = 1; y += 1; } } return *this; } int main() { int T, days; scanf("%d", &T); while (T--) { Data m1, m2; scanf("%d", &days); m1.add(days).show(); printf(" "); m2.sub(days).show(); puts(""); } return 0; }
注明:C++版本转自这位仁兄:http://www.cnblogs.com/Lyush/archive/2013/03/24/2978230.html
转载请注明原文地址:http://uwind.iteye.com/blog/1926885