http://poj.org/problem?id=3393

题意 : 对于这篇长长的英语阅读,表示无语无语再无语,花了好长时间,终于读完了。题目中规定每周的周六日为假日,其他为工作日,若是一个月的第一个工作日是周一,就定义这个月为good,若是一个周的最后一个工作日是周五,就定义这个月为luck。给你一个起始年月,一个终止年月,让你求出在这中间有多少luck月有多少good月。当然了,若是一整片文章就写了这点东西那也就太废话了,所以题目中还给出了几点应该注意的:

1.在1582年以前,只要年份取余4为0就为闰年,在1582年以后,年份取余4为0且取余100不为0或者是取余400为0才是闰年。

2.由于历史原因,1752年9月3日到9月13日是不存在的,也就是说1752年9月是少了11天的,只有19天。

3.由于历史原因,1700年无条件为闰年。

4.该历法从1年1月1日开始,这天为周六。

5.该历法每周有7天,从周六开始为第一天。

思路 :好麻烦的一道模拟题。。。。若是前一个月是luck,则下一个月必定为good,所以两个计数器可以同步,但是因为有边界问题,若是给出的起始月份是good,则前一个月份是不能够加进来的,而若是给定的终止月份是luck,那下一个月也不能加进来。为了算时好算,直接把从1年1月1日到起始日期的天数加了1,这也是为了防止出边界。所以,先算了起始月份是否是good,剩下的从起始月份开始,算的都是月份加1是不是good,luck。也就是说虽然写的是第 i 个月怎么样,但实际上,我们算的都是 i+1是不是good luck。算1年1月1日时,总的天数初始化为了1,使得直接加到了起始年份月份的第一天了,所以你每加一个月的天数,就直接加到了下一个月的第一天了,所以判断的就是下一个月的。

  1. #include <iostream>
  2. using namespace std ;
  3. int mon[] = {,,,,,,,,,,,,} ;
  4. int leapmon[] = {,,,,,,,,,,,,} ;
  5. bool leap(int n)
  6. {
  7. if(n < )
  8. {
  9. if(n % == )
  10. return true ;
  11. return false ;
  12. }
  13. else
  14. {
  15. if((n% == &&n%!=)||(n% == )||n==)
  16. return true;
  17. return false ;
  18. }
  19. }
  20. int sum(int startyear,int startmonth)
  21. {
  22. int day = ;
  23. for(int i = ; i < startyear ; i++)
  24. {
  25. if(leap(i))
  26. day += ;
  27. else day += ;
  28. }
  29. for(int i = ; i < startmonth ; i++)
  30. if(leap(startyear))
  31. day += leapmon[i] ;
  32. else day += mon[i] ;
  33. if(startyear > ||(startyear == &&startmonth > ))
  34. day -= ;
  35. return day ;
  36. }
  37. int main()
  38. {
  39. int t ;
  40. cin>>t ;
  41. while(t--)
  42. {
  43. int startyear ,startmon ,endyear,endmon ;
  44. cin>>startyear>>startmon>>endyear>>endmon ;
  45. int day = sum(startyear,startmon) ;
  46. int good = ,luck = ;
  47. if(((day+)% == ) || ((day+)% == )||((day+)% == ))
  48. good++ ;
  49. int j ;
  50. for(int i = startyear ; i < endyear ; i++)
  51. {
  52. i == startyear ? j = startmon : j = ;
  53. for( ; j <= ; j++)
  54. {
  55. if(leap(i))
  56. day += leapmon[j] ;
  57. else day += mon[j] ;
  58. if(i == &&j == )
  59. day -= ;
  60. if(((day+)% == ) || ((day+)% == )||((day+)% == ))
  61. {good++ ;luck++ ;}
  62. }
  63. }
  64. startyear == endyear ? j = startmon : j = ;
  65. for( ; j <= endmon ; j++)
  66. {
  67. if(leap(endyear))
  68. day += leapmon[j] ;
  69. else day += mon[j] ;
  70. if(endyear == && j == )
  71. day -= ;
  72. if(((day+)% == ) || ((day+)% == )||((day+)% == ))
  73. {
  74. if(j != endmon)
  75. good++ ;
  76. luck++ ;
  77. }
  78. }
  79. cout<<luck<<" "<<good<<endl ;
  80. }
  81. return ;
  82. }

POJ 3393 Lucky and Good Months by Gregorian Calendar的更多相关文章

  1. POJ 3393 Lucky and Good Months by Gregorian Calendar 模拟题

    题目:http://poj.org/problem?id=3393 不多说了,简单模拟题,因为粗心写错了两个字母,导致错了N遍,模拟还是一贯的恶心,代码实在不想优化了,写的难看了点.. #includ ...

  2. poj 3393 Lucky and Good Months by Gregorian Calendar(模拟)

    题目:http://poj.org/problem?id=3393一道题目挺长的模拟题,参考了网上大神的题解. #include <iostream> #include <cstdi ...

  3. POJ 3393:Lucky and Good Months by Gregorian Calendar 年+星期 模拟

    Lucky and Good Months by Gregorian Calendar Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  4. Lucky and Good Months by Gregorian Calendar - POJ3393模拟

    Lucky and Good Months by Gregorian Calendar Time Limit: 1000MS Memory Limit: 65536K Description Have ...

  5. Lucky and Good Months by Gregorian Calendar(poj 3393)

    大致题意: 科普文一篇,文章80%都是无用信息,因为都是常识,但是又不得不看,因为有20%是常人不知道的历史常识. 定义: Goog month : 该月第一个工作日为星期一的月份 Luckly mo ...

  6. Lucky and Good Months by Gregorian Calendar(模拟)

    http://poj.org/problem?id=3393 好大的一道模拟题,直接当阅读理解看了.下面是大神写的题意,解释的好详细. 定义: Goog month : 该月第一个工作日为星期一的月份 ...

  7. 三部曲二(基本算法、动态规划、搜索)-1003-Lucky and Good Months by Gregorian Calendar

    模拟加阅读题......虽然很多事常识性的知识,但也有许多不知道的知识,关键是不读不知道那些是已经知道的那些不是,许多重要的信息零散的分布在一大坨英文里,读起来很痛苦......自己读了一遍,读的晕晕 ...

  8. poj 2346 Lucky tickets(区间dp)

    题目链接:http://poj.org/problem?id=2346 思路分析:使用动态规划解法:设函数 d( n, x )代表长度为n且满足左边n/2位的和减去右边n/2位的和为x的数的数目. 将 ...

  9. poj3393[模拟题]

    Lucky and Good Months by Gregorian Calendar Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

随机推荐

  1. Java Mail发送简单邮件,完整代码

    依赖javax.mail.jar,地址:https://java.net/projects/javamail/pages/Home 完整示例代码如下: package com.jadic.utils; ...

  2. IOS 异步GET方法请求

    1.添加协议NSURLConnectionDelegate 2.引入头文件“NSString+URLEncoding”,用来处理URL进行编码. 3.引入头文件“NSNumber+Message”,用 ...

  3. DirectSound学习(二)--流式缓冲区

    使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据.要注意从缓冲区这时是一个环形缓冲区,声音 ...

  4. C# Json数据反序列化为Dictionary并根据关键字获取指定值1

    Json数据: { "dataSet": { "header": { "returnCode": "0", " ...

  5. js自运行函数

    学习闭包的基础知识: 函数声明 function fn(){ //这里是代码 }; fn(); //运行fn函数 与上面等价 var fn = function(){ //这里是代码 } fn(); ...

  6. [Testing] 測試電子原文書

    測試電子原文書 http://files.cnblogs.com/vincentmylee/SoftwareTesting2ndEdition.7z

  7. Python时间和日期学习

    #coding=utf-8 __author__ = 'Administrator' #日期和时间模块学习 """ Python程序能用很多方式处理日期和时间,转换日期格 ...

  8. Spark机器学习 Day1 机器学习概述

    Spark机器学习 Day1 机器学习概述 今天主要讨论个问题:Spark机器学习的本质是什么,其内部构成到底是什么. 简单来说,机器学习是数据+算法. 数据 在Spark中做机器学习,肯定有数据来源 ...

  9. IEEE 754 浮点数的四种舍入方式

    四种舍入方向: 向最接近的可表示的值:当有两个最接近的可表示的值时首选"偶数"值:向负无穷大(向下):向正无穷大(向上)以及向0(截断). 说明:默认模式是最近舍入(Round t ...

  10. 在fedora 桌面上添加应用程序

    在网上下了个android studio,这个程序只是的压缩包,解压后程序也只能在SHELL下敲入studio.sh才能运行 能不能向其他程序一样,在fedora桌面上找到应用程序,点击执行呢.在网上 ...