题目简介:
世界上最遥远的距离
不是生与死
而是我就站在你面前
你却不知道我爱你
世界上最遥远的距离
不是我就站在你面前你却不知道我爱你
而是明明知道彼此相爱
却不能在一起
世界上最遥远的距离
不是明明知道彼此相爱却不能在一起
而是相约好了私奔的时间
我穿越到了未来 你却回去了古代
——摘自《小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
相关推荐
【标题】"杭电ACM2000-2011答案"指的是杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)在2000年至2011年间举办的一系列ACM/ICPC(国际大学生程序设计竞赛)训练题目及其对应的解题代码。ACM/ICPC是...
综上所述,这份“杭电ACM -PPT”资源很可能是对ACM竞赛准备的宝贵材料,涵盖了算法、数据结构、编程实践以及比赛策略等多个方面的知识,对于想要参加ACM比赛或提升编程能力的学生来说,具有很高的学习价值。
《杭电ACM基础教程课件》是一套全面讲解ACM(国际大学生程序设计竞赛)基础知识的教育资源,由杭州电子科技大学精心制作,共分为13讲。这些课件旨在帮助学生掌握编程竞赛所需的核心技能,为参与ACM比赛打下坚实的...
【杭电ACM训练课件】是一份内部的教育资源,主要针对ACM(国际大学生程序设计竞赛)的训练。这份课件可能包含了丰富的编程理论、算法解析、实战技巧等内容,旨在提升参赛者的编程能力和问题解决能力。在学习这份资料...
杭电acm答案,都能够很容易理解,有需要的可以下载看看!!!杭电acm答案,都能够很容易理解,有需要的可以下载看看杭电acm答案,都能够很容易理解,有需要的可以下载看看杭电acm答案,都能够很容易理解,有需要的可以...
【杭电ACM AC代码】是指杭州电子科技大学(Hangzhou Dianzi University)在ACM国际大学生程序设计竞赛(ICPC,International Collegiate Programming Contest)中的解决方案集合。这些代码是参赛队伍在解决算法问题...
【杭电ACM部分题目答案】与【初学者PPT】是针对计算机编程竞赛——杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)的ACM/ICPC(国际大学生程序设计竞赛)训练资源。这个压缩包包含了一些解答过的杭电...
【杭电ACM部分答案】涉及的是编程竞赛领域的一个专项训练,主要针对的是杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)所举办的ACM/ICPC(国际大学生程序设计竞赛)的练习题目。这个压缩包中的内容...
杭电(Hangzhou Dianzi University)的在线判题系统——HDU ACM/ICPC Online Judge,是众多编程爱好者和ACMer练习编程技能的重要平台。该平台提供了大量的算法题目,其中包括许多经典的动态规划问题。通过解决这些...
【杭电ACM竞赛队上课课件】是针对ACM国际大学生程序设计竞赛精心准备的一套教育资源,由杭州电子科技大学的知名教练主导。这个课件集合对于那些希望在ACM竞赛中崭露头角,或者对算法有深厚兴趣的同学们来说,无疑是...
【北大杭电ACM题解(详细)】是针对北京大学与杭州电子科技大学主办的ACM/ICPC(国际大学生程序设计竞赛)所编写的详细解题资料。这些解题报告和指南旨在帮助参赛者理解和解决各类算法问题,提高编程及问题解决能力...
《杭电ACM题集与浙大ACM题集》是专为热衷于程序设计和算法提升的朋友精心准备的资源。这两份题集涵盖了大量经典的编程竞赛题目,旨在帮助学习者提高C、C++、Java等编程语言的算法设计与实现能力。ACM(国际大学生...
【标题】"浙江杭电ACM教学资料"涵盖了多个ACM竞赛编程的重要主题,适合初学者逐步学习。这些教学资料采用PPT格式,便于理解和记忆关键概念。 【描述】"入门专用,格式PPt"表明这是一套为刚接触ACM竞赛编程的人设计...
【杭电ACM课件.zip】是一个包含了杭州电子科技大学(Hangzhou Dianzi University,简称杭电)关于ACM竞赛课程相关资料的压缩文件。ACM国际大学生程序设计竞赛(International Collegiate Programming Contest,简称...
【杭电ACM训练营课件】是一套专门为ACM(国际大学生程序设计竞赛)爱好者和参赛者设计的培训资源,旨在提升参赛者的算法能力和问题解决技巧。这套课件涵盖了ACM竞赛中常见的核心算法,包括但不限于贪心算法、二分...
【标题】:“杭电ACM入门资料”是一个针对初学者准备的资源集合,旨在帮助他们踏入ACM(国际大学生程序设计竞赛)的世界。这个压缩包包含了一系列与ACM相关的学习材料,涵盖了基础到进阶的知识点,对于想要在算法和...
【杭电ACM分类】是针对杭州电子科技大学(HDU)在线判题系统(OJ)中的编程竞赛题目进行的一种整理和归类方式。这些竞赛题目通常涉及算法设计、数据结构、数学应用等多个方面,旨在提升参赛者的编程思维和解决实际...
【杭电ACM上课课件】是一份涵盖了广泛算法知识的教学资源,主要针对计算机科学竞赛,特别是ACM(国际大学生程序设计竞赛)的参赛者。这些课件详细讲解了多种算法,旨在帮助学习者掌握解决复杂计算问题的核心技能。...
【杭电ACM讲义内容概述】 这是一份专为初学者设计的、关于杭电ACM竞赛的经典讲义,涵盖了计算机科学中的基础算法知识。讲义内容丰富,旨在帮助学习者逐步掌握解决实际问题所需的编程技巧和算法思维。通过这份讲义,...
【杭电ACM课件(精品)】是针对ACM(国际大学生程序设计竞赛)的一套高质量学习资源,尤其适合编程新手和希望提升算法能力的同学们。这些课件全面覆盖了ACM竞赛中常见的核心算法和问题解决策略,旨在帮助学习者系统...