zoukankan      html  css  js  c++  java
  • hihoCoder 1148 2月29日

    时间限制:2000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。

    只有闰年有2月29日,满足以下一个条件的年份为闰年:

    1. 年份能被4整除但不能被100整除

    2. 年份能被400整除

    输入

    第一行为一个整数T,表示数据组数。

    之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month为{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。day与year为两个数字。

    数据保证给定的日期合法且第一个日期早于或等于第二个日期。

    输出

    对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为答案。

    数据范围

    1 ≤ T ≤ 550

    小数据:

    2000 ≤ year ≤ 3000

    大数据:

    2000 ≤ year ≤ 2×109

    样例输入
    4
    January 12, 2012
    March 19, 2012
    August 12, 2899
    August 12, 2901
    August 12, 2000
    August 12, 2005
    February 29, 2004
    February 29, 2012
    样例输出
    Case #1: 1
    Case #2: 0
    Case #3: 1
    Case #4: 3




    题目大意我就不说嘞!这题很容易就能读懂。
    这题如果直接用for循环跑一边找闰年的话,对于小数据可能回A但是大数据就会TLE
    so~这题我们可以直接求出两个时间段之间 闰年的个数(即2月29日的个数)

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <algorithm>
     6 #define ll long long
     7 using namespace std;
     8 
     9 char month[12][20] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"};
    10 int f(char a[])    // 返回对应的月份
    11 {
    12     int i;
    13     for (i = 0; i < 12; i ++)
    14     {
    15         if (strcmp(a,month[i])==0)
    16             break;
    17     }
    18     return i+1;
    19 }
    20 int main ()
    21 {
    22     ll start_year,start_day;
    23     ll end_year,end_day;
    24     char smonth[20],emonth[20];
    25     int i,t,ff;
    26     while (~scanf("%d",&t))
    27     {
    28         ff = 1;
    29         while (t --){
    30             scanf("%s %lld, %lld",smonth,&start_day,&start_year);
    31             scanf("%s %lld, %lld",emonth,&end_day,&end_year);
    32             if (f(smonth)==1 || (f(smonth)==2&&start_day<=29))  // 判断给定的两个时间是否包含2月29日
    33                 start_year --;
    34             if (f(emonth)==1 || (f(emonth)==2&&end_day<29))
    35                 end_year --;
    36             ll sum = 0;                   // 利用判断闰年的方法求闰年的个数
    37             sum = end_year/4 - start_year/4;    //能被4整数的   
    38             sum = sum - (end_year/100 - start_year/100);   // 减去 能被100整数的
    39             sum += ((end_year/400 - start_year/400));      // 加上 能被400整除的
    40 
    41             printf("Case #%d: %lld
    ",ff ++,sum);
    42         }
    43 
    44     }
    45     return 0;
    46 }
     
  • 相关阅读:
    学习总结之三(SQL SERVER游标CURSOR的使用)
    根据经纬度坐标计算两点间几何距离 椰子树下 CSDN博客
    多个CSS风格共用同一(背景)图片_那一片天_百度空间
    JAVA md5把我气到疯的代码,天哪,神呀,我的C# 啊。
    SQL中的系统变量一览
    在Windows下安装Redmine
    Fragment中的方法findFragmentById(int id)的返回值探讨
    AndroidVideoCache 框架源码分析
    从零开始编译属于你的FFmpeg
    Glide填坑指南
  • 原文地址:https://www.cnblogs.com/yoke/p/6883817.html
Copyright © 2011-2022 走看看