`
闫老三
  • 浏览: 102477 次
社区版块
存档分类
最新评论

杭电ACM4515 小Q系列故事——世界上最遥远的距离

    博客分类:
  • ACM
 
阅读更多

题目简介:

世界上最遥远的距离
  不是生与死
  而是我就站在你面前
  你却不知道我爱你

  世界上最遥远的距离
  不是我就站在你面前你却不知道我爱你
  而是明明知道彼此相爱
  却不能在一起

  世界上最遥远的距离
  不是明明知道彼此相爱却不能在一起
  而是相约好了私奔的时间
  我穿越到了未来 你却回去了古代

    ——摘自《小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答案

    【标题】"杭电ACM2000-2011答案"指的是杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)在2000年至2011年间举办的一系列ACM/ICPC(国际大学生程序设计竞赛)训练题目及其对应的解题代码。ACM/ICPC是...

    杭电ACM -ppt

    综上所述,这份“杭电ACM -PPT”资源很可能是对ACM竞赛准备的宝贵材料,涵盖了算法、数据结构、编程实践以及比赛策略等多个方面的知识,对于想要参加ACM比赛或提升编程能力的学生来说,具有很高的学习价值。

    杭电acm基础教程课件

    《杭电ACM基础教程课件》是一套全面讲解ACM(国际大学生程序设计竞赛)基础知识的教育资源,由杭州电子科技大学精心制作,共分为13讲。这些课件旨在帮助学生掌握编程竞赛所需的核心技能,为参与ACM比赛打下坚实的...

    杭电ACM训练课件

    【杭电ACM训练课件】是一份内部的教育资源,主要针对ACM(国际大学生程序设计竞赛)的训练。这份课件可能包含了丰富的编程理论、算法解析、实战技巧等内容,旨在提升参赛者的编程能力和问题解决能力。在学习这份资料...

    杭电ACM答案 蓝桥杯

    杭电acm答案,都能够很容易理解,有需要的可以下载看看!!!杭电acm答案,都能够很容易理解,有需要的可以下载看看杭电acm答案,都能够很容易理解,有需要的可以下载看看杭电acm答案,都能够很容易理解,有需要的可以...

    杭电acm ac代码

    【杭电ACM AC代码】是指杭州电子科技大学(Hangzhou Dianzi University)在ACM国际大学生程序设计竞赛(ICPC,International Collegiate Programming Contest)中的解决方案集合。这些代码是参赛队伍在解决算法问题...

    杭电ACM部分题目答案和初学者PPT

    【杭电ACM部分题目答案】与【初学者PPT】是针对计算机编程竞赛——杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)的ACM/ICPC(国际大学生程序设计竞赛)训练资源。这个压缩包包含了一些解答过的杭电...

    杭电Acm部分答案

    【杭电ACM部分答案】涉及的是编程竞赛领域的一个专项训练,主要针对的是杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)所举办的ACM/ICPC(国际大学生程序设计竞赛)的练习题目。这个压缩包中的内容...

    杭电acmDP(动态规划)

    杭电(Hangzhou Dianzi University)的在线判题系统——HDU ACM/ICPC Online Judge,是众多编程爱好者和ACMer练习编程技能的重要平台。该平台提供了大量的算法题目,其中包括许多经典的动态规划问题。通过解决这些...

    杭电ACM竞赛队上课课件

    【杭电ACM竞赛队上课课件】是针对ACM国际大学生程序设计竞赛精心准备的一套教育资源,由杭州电子科技大学的知名教练主导。这个课件集合对于那些希望在ACM竞赛中崭露头角,或者对算法有深厚兴趣的同学们来说,无疑是...

    北大杭电acm题解(详细)

    【北大杭电ACM题解(详细)】是针对北京大学与杭州电子科技大学主办的ACM/ICPC(国际大学生程序设计竞赛)所编写的详细解题资料。这些解题报告和指南旨在帮助参赛者理解和解决各类算法问题,提高编程及问题解决能力...

    杭电acm题集以及浙大acm题集

    《杭电ACM题集与浙大ACM题集》是专为热衷于程序设计和算法提升的朋友精心准备的资源。这两份题集涵盖了大量经典的编程竞赛题目,旨在帮助学习者提高C、C++、Java等编程语言的算法设计与实现能力。ACM(国际大学生...

    浙江杭电ACM教学资料

    【标题】"浙江杭电ACM教学资料"涵盖了多个ACM竞赛编程的重要主题,适合初学者逐步学习。这些教学资料采用PPT格式,便于理解和记忆关键概念。 【描述】"入门专用,格式PPt"表明这是一套为刚接触ACM竞赛编程的人设计...

    杭电ACM课件.zip

    【杭电ACM课件.zip】是一个包含了杭州电子科技大学(Hangzhou Dianzi University,简称杭电)关于ACM竞赛课程相关资料的压缩文件。ACM国际大学生程序设计竞赛(International Collegiate Programming Contest,简称...

    杭电ACM训练营课件

    【杭电ACM训练营课件】是一套专门为ACM(国际大学生程序设计竞赛)爱好者和参赛者设计的培训资源,旨在提升参赛者的算法能力和问题解决技巧。这套课件涵盖了ACM竞赛中常见的核心算法,包括但不限于贪心算法、二分...

    杭电ACM入门资料

    【标题】:“杭电ACM入门资料”是一个针对初学者准备的资源集合,旨在帮助他们踏入ACM(国际大学生程序设计竞赛)的世界。这个压缩包包含了一系列与ACM相关的学习材料,涵盖了基础到进阶的知识点,对于想要在算法和...

    杭电ACM分类杭电ACM分类

    【杭电ACM分类】是针对杭州电子科技大学(HDU)在线判题系统(OJ)中的编程竞赛题目进行的一种整理和归类方式。这些竞赛题目通常涉及算法设计、数据结构、数学应用等多个方面,旨在提升参赛者的编程思维和解决实际...

    杭电acm上课课件

    【杭电ACM上课课件】是一份涵盖了广泛算法知识的教学资源,主要针对计算机科学竞赛,特别是ACM(国际大学生程序设计竞赛)的参赛者。这些课件详细讲解了多种算法,旨在帮助学习者掌握解决复杂计算问题的核心技能。...

    杭电acm的部分讲义内容

    【杭电ACM讲义内容概述】 这是一份专为初学者设计的、关于杭电ACM竞赛的经典讲义,涵盖了计算机科学中的基础算法知识。讲义内容丰富,旨在帮助学习者逐步掌握解决实际问题所需的编程技巧和算法思维。通过这份讲义,...

    杭电ACM课件(精品)

    【杭电ACM课件(精品)】是针对ACM(国际大学生程序设计竞赛)的一套高质量学习资源,尤其适合编程新手和希望提升算法能力的同学们。这些课件全面覆盖了ACM竞赛中常见的核心算法和问题解决策略,旨在帮助学习者系统...

Global site tag (gtag.js) - Google Analytics