February 29(模拟)

D - D

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Submit Status Practice LightOJ 1414

Description

It is 2012, and it‘s a leap year. So there is a "February 29" in this year, which is called leap day. Interesting thing is the infant who will born in this February 29, will get his/her birthday again in 2016, which is another leap year. So February 29 only exists in leap years. Does leap year comes in every 4 years? Years that are divisible by 4 are leap years, but years that are divisible by 100 are not leap years, unless they are divisible by 400 in which case they are leap years.

In this problem, you will be given two different date. You have to find the number of leap days in between them.

Input

Input starts with an integer T (≤ 550), denoting the number of test cases.

Each of the test cases will have two lines. First line represents the first date and second line represents the second date. Note that, the second date will not represent a date which arrives earlier than the first date. The dates will be in this format - "month day, year", See sample input for exact format. You are guaranteed that dates will be valid and the year will be in between 2 * 103 to 2 * 109. For your convenience, the month list and the number of days per months are given below. You can assume that all the given dates will be a valid date.

Output

For each case, print the case number and the number of leap days in between two given dates (inclusive).

Sample Input

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

Sample Output

Case 1: 1

Case 2: 0

Case 3: 1

Case 4: 3

题解:给两个日期,找在之间的2月29号的个数;wa了9次,所幸过了。。。

the second date will not represent a date which arrives earlier than the first date代表第二个日期比第一个大;

代码:

  1 #include<cstdio>
  2 #include<set>
  3 #include<queue>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<map>
  7 #include<string>
  8 using namespace std;
  9 bool js(int y,int r, int yy, int rr){
 10     if(y < yy)return true;
 11     if(y > yy)return false;
 12     if(r <= rr)return true;
 13     return false;
 14 }
 15 bool rn(int y){
 16     if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
 17         return true;
 18     return false;
 19 }
 20 map<string, int>mp;
 21 void init(){
 22     mp["January"] = 1;
 23     mp["February"] = 2;
 24     mp["March"] = 3;
 25     mp["April"] = 4;
 26     mp["May"] = 5;
 27     mp["June"] = 6;
 28     mp["July"] = 7;
 29     mp["August"] = 8;
 30     mp["September"] = 9;
 31     mp["October"] = 10;
 32     mp["November"] = 11;
 33     mp["December"] = 12;
 34 }
 35 void work(int &y1,int &y2,int &m1,int &m2,int &d1,int &d2){
 36     if(y1 > y2){
 37         swap(y1,y2);
 38         swap(m1,m2);
 39         swap(d1,d2);
 40         return;
 41     }
 42     if(y1 < y1){
 43         return;
 44     }
 45     if(m1 > m2){
 46         swap(y1,y2);
 47         swap(m1,m2);
 48         swap(d1,d2);
 49         return;
 50     }
 51     if(m1 < m2){
 52         return;
 53     }
 54     if(d1 > d2){
 55         swap(y1,y2);
 56         swap(m1,m2);
 57         swap(d1,d2);
 58         return;
 59     }
 60 }
 61 int find(int y){
 62     int t, t1, t2;
 63     t = (y - 2000) / 4 + 1;
 64     t1 = (y - 2000) / 100 + 1;
 65     t2 = (y - 2000) / 400 + 1;
 66     return (t - t1 + t2);
 67 }
 68 int main(){
 69     int N, kase = 0;
 70     char s1[15], s2[15];
 71     int y1, d1, y2, d2, m1, m2;
 72     scanf("%d", &N);
 73     init();
 74     while(N--){
 75         scanf("%s%d,%d", s1, &d1, &y1);
 76         scanf("%s%d,%d", s2, &d2, &y2);
 77         if(mp.count(s1)){
 78             m1 = mp[s1];
 79         }
 80         else while(1);
 81         if(mp.count(s2)){
 82             m2 = mp[s2];
 83         }
 84         else while(1);
 85     //    work(y1,y2,m1,m2,d1,d2);
 86         if(y1 == y2){
 87             if(rn(y1) && js(m1,d1, 2, 29) && js(2, 29, m2, d2)){
 88                 printf("Case %d: %d\n", ++kase, 1);
 89                 continue;
 90             }
 91             printf("Case %d: %d\n", ++kase, 0);
 92             continue;
 93         }
 94         int t = find(y2 - 1) - find(y1);

 95         if(rn(y1) && js(m1,d1, 2, 29))t++;
 96         if(rn(y2) && js(2, 29, m2, d2))t++;
 97         printf("Case %d: %d\n", ++kase, t);
 98     }
 99     return 0;
100 }
时间: 2024-10-26 12:39:30

February 29(模拟)的相关文章

lightoj - 1414 February 29

February 29 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submit Status Description It is 2012, and it's a leap year. So there is a "February 29" in this year, which is called leap day. Interesting thing is the in

2104.10.29模拟赛【奶牛编号】

2.奶牛编号 [问题描述] 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛.      然而,他有点迷信,标识奶牛用的二进制数字,必须只含有K位“1” (1 <= K <= 10). 当然,每个标识数字的首位必须为“1”.      FJ按递增的顺序,安排标识数字,开始是最小可行的标识数字 (由“1”组成的一个K位数).      不幸的是,他没有记录下标识数字.请帮他计算,第N个标识数字 (1 <= N <= 10^7). [输入] 第1行:空格隔开的两

2017/9/29模拟赛

T1.多米诺骨牌(card)小 Z 最近买了很多很多的多米诺骨牌,他选出了其中的一些排成了一排,并且准备从右到左碰倒这些骨牌.每个骨牌有一个坐标 xi(>=1)和一个大小 yi(>=1),倒下时将会碰倒坐标区间位于[xi-yi,xi)内的所有骨牌.当然没有两个骨牌有相同的坐标, 并且小 Z 规定坐标大的更靠右.但是他发现他买的骨牌太巨了,所以在倒下的时候会将所有碰倒的骨牌破坏掉,被破坏掉的骨牌就无法使用了,并且不会倒下.得知这个消息的小 Z 十分惊讶,他想知道如果还按刚才这种方法从右到左碰倒所

9.29模拟赛

T1: [数据范围] 40%的数据满足 A<=105: 另有30%的数据满足N,M<=109 :|S|,|T|<=10(|S|表示S的长度): 100%的数据满足 N,M<=109 :|S|,|T|<=106. 先求循环节内,即lcm(S,T)内,匹配数出现次数. 然后乘上循环次数即可. 就是S,T内对d=gcd(S,T)同余的位置的相等字符对数的数量. 可以证明. 证明: 设S长度为l1,T长度为l2 如果一个S中位置a的字符和T中位置b的字符相同. 如果可以在循环节内匹配

hiho 编程之美2015资格赛(2月29日-模拟日期)

题目1 : 2月29日 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"January", "Feb

2月29日(编程之美2015资格赛)

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"January", "February",

hihoCoder 1148 2月29日

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"January", "February",

2月29日

我自己写的代码测试论坛上的数据都通过的,但是就是通不过OJ,应该是超时,给大家提供一种思路吧. 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 年份能被4整除但不能被100整除 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{

poj3393[模拟题]

Lucky and Good Months by Gregorian Calendar Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1702   Accepted: 569 Description Have you ever wondered why normally an year has 365 days, not 400 days? Why August have 31 days, but February ha