码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1079 Calendar Game(博弈)

时间:2015-06-03 13:39:25      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:

<p style="margin-top: 0px; margin-bottom: 0.75em; font-size: 16px; line-height: 27.2000007629395px; text-indent: 1em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; background-color: rgb(254, 254, 254);"><span style="color: rgb(255, 0, 0);"><span style="text-indent: 0px;">典型的博弈论,算法思路为在初始化的过程中便获得2001.11.4到1990.1.1期间所有日期的胜败情况。对于y-m-d日期,若其下一天和下一月中有一个为必败情况,则今天为必胜。若两者均为必胜,则今天为必败。主要难度在于前一日(getDayBefore)和后一月(isValidNextMonth)日期的判定,要注意闰年情况的特殊性。 
</span></span></p><p style="margin-top: 0px; margin-bottom: 0.75em; font-size: 16px; line-height: 27.2000007629395px; text-indent: 1em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; background-color: rgb(254, 254, 254);"><span style="color: rgb(255, 0, 0);"><span style="text-indent: 0px;">虽然说这样可行。但是,网上给出了另外一种巧解,如下。</span></span></p><p style="margin-top: 0px; margin-bottom: 0.75em; font-size: 16px; line-height: 27.2000007629395px; text-indent: 1em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Tahoma, Arial, STXihei, 'Microsoft YaHei', 微软雅黑, sans-serif; background-color: rgb(254, 254, 254);"><span style="color: rgb(255, 0, 0);"><span style="text-indent: 0px;">从后往前推,对于某一天的胜败由两天决定:后一天和后一个月的同一天(当然有的没有第二个决定因素) 
若两者都是必胜态,则这一天必败。若有一天为必败,则这一天必胜。 
2001年11月4日到2001年10月4日胜败是交替的,设月+日等于M。发现M为偶数时必胜,为奇数是必败。 
2001年10月4日必胜,10月3日由10月4日和11月3号决定,两者都是必胜,所以10月3号必败。同理可判定10月剩余的日子。相邻的两个月的同一天胜败情况相反,但这一天M的奇偶性也相反(月份或日期两者只有一个减一),所以结论成立。 
下面考虑特殊情况: 
9月只有30天,9月30号由10月1号(必败)和10月30号(必胜)决定,为必胜。与上述结论矛盾,但9月29号为必胜,9月后面的日子依然遵循这样的规律,可见9月30号为一个特殊情况,同样的特殊情况还有11月30号(用同样的方法判断4,6月30号发现遵循结论),对于2月(不管是闰年还是平年)发现也符合。 </span></span></p>
#include<cstdio>
int main()
{
    int year,month,day,n;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d%d",&year,&month,&day);
        if((month==9 || month==10) && day == 30) printf("YES\n");
        else if ((month + day)%2 == 1) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

hdu1079 Calendar Game(博弈)

标签:

原文地址:http://blog.csdn.net/a197p/article/details/46344169

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!