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

杭电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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics