pku 3393 Lucky and Good Months by Gregorian Calendar 英语阅读题

哎。。怎么说呢,这种题目一点细节注意不到就是几个小时的浪费
总结下题目吧
说白了就是计算公历系统中某年某月的第一天是不是周一、周六、周日以及某年某月的最后一天是不是周五、周六、周日
关于公历大家知道的就不说了,说几点大家可能不知道的
1、关于闰年
An year y, y > 1582 and y ≠ 1700, is a leap year if and only if(注意!1700算闰年)
  • y is divisible by 4, and

  • y is not divisible by 100 unless it is divisible by 400.

An year y, 0 < y < 1582 is a leap year if and only if

  • y is divisible by 4.
2、关于公历中有11天的缺失
 11 days are eliminated starting September 3, 1752 in order for people not to rewrite history

下面就是常规的做法了。。
统计截止到每一年有多少天,然后将所有的lucky month和good month都找出来,顺序存放在数组中,查询的时候二分减一下就可以了~
代码:
 1 # include <iostream>
 2 using namespace std;
 3 int o[]={31,28,31,30,31,30,31,31,30,31,30,31},l[]={31,29,31,30,31,30,31,31,30,31,30,31};
 4 int y[10001];
 5 # include <vector>
 6 # include <algorithm>
 7 # define MON 730124
 8 # define FRI 730121
 9 # define SAT 730122
10 # define SUN 730123
11 vector<int> lucky,good;
12 int main()
13 {
14     //init
15     for(int i=1;i<12;i++)
16       o[i]+=o[i-1],l[i]+=l[i-1];
17     y[0]=0;
18     for(int i=1;i<10000;i++)
19     {
20       if(i<1582&&i%4==0||i>1582&&(i%4==0&&i%100!=0||i%400==0)||i==1700)
21           y[i]=y[i-1]+l[11];
22       else
23           y[i]=y[i-1]+o[11];
24       if(i==1752) y[i]-=11;
25     }
26    for(int i=1;i<10000;i++)
27    {
28          
29         int *m;
30         if(i<1582&&i%4==0||i>1582&&(i%4==0&&i%100!=0||i%400==0)) m=l;
31         else m=o;
32         if(i==1752)
33         {
34           for(int j=8;j<12;j++) m[j]-=11;
35         } 
36         if((y[i-1]+1-MON)%7==0||(y[i-1]+1-SAT)%7==0||(y[i-1]+1-SUN)%7==0) good.push_back(i*12+1);
37         if((y[i-1]+o[0]-FRI)%7==0||(y[i-1]+o[0]-SAT)%7==0||(y[i-1]+o[0]-SUN)%7==0) lucky.push_back(i*12+1);
38         for(int j=1;j<12;j++)
39         {
40            if((y[i-1]+1+m[j-1]-MON)%7==0||(y[i-1]+1+m[j-1]-SAT)%7==0||(y[i-1]+1+m[j-1]-SUN)%7==0) good.push_back(i*12+j+1);
41            if((y[i-1]+m[j]-FRI)%7==0||(y[i-1]+m[j]-SAT)%7==0||(y[i-1]+m[j]-SUN)%7==0) lucky.push_back(i*12+j+1);
42         }     
43         if(i==1752)
44         {
45           for(int j=8;j<12;j++) m[j]+=11;
46         } 
47    }
48    int n;
49    cin>>n;
50    while(n--)
51    {
52       int y1,m1,y2,m2;
53       cin>>y1>>m1>>y2>>m2;
54       cout<<upper_bound(lucky.begin(),lucky.end(),y2*12+m2)-lower_bound(lucky.begin(),lucky.end(),y1*12+m1)<<" "<<upper_bound(good.begin(),good.end(),y2*12+m2)-lower_bound(good.begin(),good.end(),y1*12+m1)<<endl;
55    }
56    //system("pause");
57    return 0;
58 }
59 


posted on 2011-01-06 00:14 yzhw 阅读(183) 评论(0)  编辑 收藏 引用 所属分类: others


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜