正式赛-ZZULIOJ-1878-蛤玮准备礼物

Contest - “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛暨河南高校邀请赛-正式赛

Problem E: 蛤玮准备礼物

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 715 Solved: 106

SubmitStatusWeb Board
Description

蛤玮的妹子要过生日了,经过千挑万选,蛤玮决定给妹子买一盒水彩铅笔,然而卖多少个才合适呢.机智的蛤玮决定数一数今天是妹子出生的第多少天,然后就买那么多根铅笔.

给出蛤玮妹子的生日和今天的日期,求蛤玮一共需要买多少.
注意:生日当天算第0天.
Input

T(1<=T<=1000),表示数据组数.

每组数据一行y1,m1,d1,y2,m2,d2,其中y1,m1,d1表示妹子生日的年月日,y2,m2,d2表示蛤玮所在时空的当前天的年月日.
(1900<=y<=1000000, 1<=m<=12, 1<=d<=当月应有天数).输入保证当前天在妹子生日之后.
Output

每组数据输出一行,蛤玮要买多少根铅笔.
Sample Input

2
1995 10 24 1995 10 25
1996 1 9 1996 3 7
Sample Output

1
58

求出两个给定日期之间的天数,注意数据范围在1900到一百万之间,并且有一百组,很容易超时。
由于闰年的特性,每四百年为一周期,天数是相同的,可以用这点来优化
比较考验代码能力的模拟题
代码

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
bool is_leap_year(int x)//x是闰年返回1,否则返回0
{
    return x%400==0||(x%4==0&&x%100!=0)?1:0;
}
int Query(int year,int math)//返回一年中这个月的天数
{
    if(math==1||math==3||math==5||math==7||math==8||math==10||math==12)
        return 31;
    else if(math==2)
        return is_leap_year(year)?29:28;
    else
        return 30;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int y1,m1,d1,y2,m2,d2;
        scanf("%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2);
        int num_1=0;//出生那年第一天到出生日期
        int num_2=0;//当前这年第一天到当前日期
        int sum=0;//总的天数
        for(int i=1; i<m1; i++)
            num_1+=Query(y1,i);
        num_1+=d1;
        for(int i=1; i<m2; i++)
            num_2+=Query(y2,i);
        num_2+=d2;
        if(y1==y2)//出生日期和当前日期在同一年
        {
            printf("%d\n",num_2-num_1);//作差输出
            continue;//后面的不必进行
        }
        else//出生日期和当前日期不在同一年
        {
            sum+=is_leap_year(y1)?366-num_1+num_2:365-num_1+num_2;//掐头去尾
            if((y2-1-(y1+1))>400)//400年一个循环
            {
                int flag_num=(y2-1-(y1+1))/400;//循环次数
                int flag_sum=0;//循环数值
                for(int i=y1+1; i<=y1+400; i++)
                    flag_sum+=is_leap_year(i)?366:365;
                sum+=flag_num*flag_sum;
                for(int i=y1+flag_num*400+1; i<y2; i++)
                    sum+=is_leap_year(i)?366:365;
            }
            else//不足400年
            {
                for(int i=y1+1; i<y2; i++)
                    sum+=is_leap_year(i)?366:365;
            }
            printf("%d\n",sum);
        }
    }
    return 0;
}

你可能感兴趣的:(模拟,水题)