题目简介:
世界上最遥远的距离
不是生与死
而是我就站在你面前
你却不知道我爱你
世界上最遥远的距离
不是我就站在你面前你却不知道我爱你
而是明明知道彼此相爱
却不能在一起
世界上最遥远的距离
不是明明知道彼此相爱却不能在一起
而是相约好了私奔的时间
我穿越到了未来 你却回去了古代
——摘自《小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
#include
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.day12)
{
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
上面代码是C语言版的,下面给出一个C++版的,C++版的思路更为清晰,但是我觉得还是C语言版的执行效率不较高,对于ACM比赛建议采用C语言。
#include
#include
#include
#include
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