CCF 2015-03-3 节日

输出y1到y2年之间的每一年的a月份的第b个周c。感觉像是一个恶心的模拟。更像一个很恶心的小学奥赛题。

题目:http://115.28.138.223/view.page?gpid=T25

考试的时候。我猜我是做不出来的。感觉这个代码的函数用的太机智了。某人智商堪忧丫。。。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;

int run(int year) {  // 判断是否是闰年。
   if (year % 400 == 0) return 1;
   else if (year % 100 != 0 && year % 4 == 0) return 1;
   else return 0;
}

int days (int leap, int month) { // 判断这一年的1月到month月开始一共有多少天。这个函数好机智有木有。
   switch (month) {
       case 1: return 0;
       case 2: return 31;
       case 3: return leap ? 60 : 59;
       case 4: return leap ? 91 : 90;
       case 5: return leap ? 121 : 120;
       case 6: return leap ? 152 : 151;
       case 7: return leap ? 182 : 181;
       case 8: return leap ? 213 : 212;
       case 9: return leap ? 244 : 243;
       case 10: return leap ? 274 : 273;
       case 11: return leap ? 305 : 304;
       case 12: return leap ? 335 : 334;
   }
}

int monthDays(int leap, int temp) { // 判断当年的temp月有多少天。
   switch (temp) {
     case 1:
     case 3:
     case 5:
     case 7:
     case 8:
     case 12:
         return 31;
     case 4:
     case 6:
     case 9:
     case 10:
     case 11:
        return 30;
     case 2:
        return leap ? 29 : 28;
   }
}

int main() {
     int month, week, day, y1, y2;
    while(cin >> month >> week >> day >> y1 >> y2) {
      int leapCount = 0;
      for (int i=1850; i<y1; ++i) {
         if (run(i) == 1) leapCount++;
      }
      for (int i=y1; i<=y2; ++i) {
         // 对于我这种小学数学没学好的人来说。。。下面的计算太难了。。
         int totDay = (i-1850)*365 + leapCount + days(run(i), month); // 从1850年开始到当年的这个月开始一共有多少天。
         int weekDay= totDay%7 + 2;  //当年的这个月开始时周几。
         int weekCount = day < weekDay ? 1 : 2; //需要跨过几个周。如果day>weekDay。说明计数周又可以减少一个。基数是1。因为是第几周的周几。所以跨过week-1就好了。
         int ans = 8-weekDay + (week - weekCount)*7 + day;
         if (ans <= monthDays(run(i), month)) // 如果这一天在这个月存在的话。输出。
         {
             cout << i << ‘/‘;
             if (month < 10) cout << "0";
             cout << month << ‘/‘;
             if (ans < 10) cout << "0";
             cout << ans << endl;
         }
         else cout << "none\n";
         if (run(i) == 1) leapCount++;  // 开始这里忘记了。!!!
      }
    }
    return 0;
}

时间: 2024-10-29 05:20:56

CCF 2015-03-3 节日的相关文章

iOS 学习笔记 六 (2015.03.28)常见错误

2015.03.28 1. property's synthesized getter follows Cocoa naming convention for returning 'owned' objects You own any object you create You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, 

OpenSCAD 2015.03的大变化,更方便了。

OpenSCAD 2015.03出来了,有几个大的变化: 1.增加工具按钮,操作起来更方便,尤其是在Mac OS X的窗口全屏模式下. 2.坐标的标尺显示尺寸的刻度,这个对3D打印的模型设计很方便. 3.代码编辑器支持代码块折叠和自动缩进等专业代码编辑器的一些特征了. 注意:一定要自己下最新版的才有这个功能哦,我用mac port装的最新才14.03,没有这些个功能. 顺便唠叨下:到http://www.thingiverse.com,在搜索框输入openscad,可以找到大量的采用OpenSC

湖南多校对抗赛(2015.03.28) E Longest Increasing Subsequence Again

题意:给你一个序列,问你删除掉连续的一段,使得剩下的序列的最长上升字串最大,问你这个最大值. 解题思路:分段dp,  dp[i][0] ,dp[i][1]   , 0表示前面没有切过,只能从前一个数的0状态得到,1状态表示前面已经切过了,能从前一个的1状态得到,也能从 在他前面的比他值小的dp[j][0](j < i && a[j] < a[i])的最大值得到,这里用线段树维护就行了. 解题代码: 1 // File Name: b.cpp 2 // Author: darkd

湖南多校对抗赛(2015.03.28) G Good subsequence

题意:找到一个序列中极值<=k的最长字串的长度. 解题思路:set容器双递推. 解题代码: 1 // File Name: g.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时04分39秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque>

湖南多校对抗赛(2015.03.28) A Rectangle

题意:给你一些最多宽为2 的木板,让你放在一个宽为二的盒子里面,问你这个盒子最短有多长. 解题思路:DP,离中间最近的那个值. 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时13分56秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9

湖南多校对抗赛(2015.03.28) B Design road

题意:给你起点(0,0),终点(x,y),中间有很多条河, 在河上面建桥花费c1,在陆地建路花费c2,问你最小花费是多少. 解题思路:我们知道,我们考虑的时候完全可以把河都移动到一边来求,这样只需要三分就行了. 解题代码: 1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 13时26分39秒 4 5 #include<vector> 6 #include<list> 7 #

湖南多校对抗赛(2015.03.28) H SG Value

题意:给你一个集合,动态插入 ,动态询问,然后问你这个集合的sg值(这个集合用加法运算不能产生的那个最小正整数)是多少. 解题思路:假设我们现在的这个SG值是 x 1)现在插入集合里面一个数v   如果这个v > x ,那么显然  sg值x不变,  把v放进从小到大的优先队列中 2)如果这个 v <= x 那么sg值x肯定就会变成  x + v, 每更新一次 sg值,就去看优先队列top元素是否是 小于等于 x的 ,如果小于等于,其实就等于把这个top元素进行1操作,这样就不会错了. 解题代码

湖南多校对抗赛(2015.03.28) I Inversion Sequence

题意:给你一个序列a[i],代表 i这个数 在b数列中有多少个值在它前面且比它大,问你求B序列 解题思路:线段树的简单应用,找第几个空,类似二分. 解题代码: 1 // File Name: i.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时56分11秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<

2015.03.20使命

1. 人生往往不在于权利有多大,金钱物质有多少,,当你作为一个程序猿,你的使命是做出最美丽的程序,当你做制板硬件工作,你的使命是做更好的板子..把自己的角色作为自己人生的使命来经营自己..相信你在物质上不会有太多遗憾.,..2015,加油.

2015.03.16

上班第一天,刚开始是刘青欢迎我们实习生,然后介绍了一下公司.接着,他把我们分成了小组,让完成一个任务计划书,我们组的名字是我取得,“亮剑华环”,够霸气吧!哈哈...然后,开发部的郝经理,又给我们讲了会话,谈到小米“专注,极致,口碑,快”,告诫我们,既然来干通信这个行业,就要做到专注,要深入的去了解这个行业,接着要做到极致,要精益求精,为顾客创造更大价值. 下来又是刘青,让我们做了一个小棍子的游戏, 中午吃饭 下午,刘青介绍公司部门 王一超总工程师培训,SDH  PDH