zoukankan      html  css  js  c++  java
  • 洛谷P1512伊甸园日历游戏-题解

    原题:

    思路:

    考虑搜索,显然有必胜策略

    对于能转移到必胜状态的,必输,因为它把必胜状态给了对方

    由此可以用搜索解决

    但是DFS麻烦,于是我们换一种策略

    类似动规

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int f[2010][13][40];
    int mth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int main()
    {
        cin >> n;
        int x,y,z;
        x=2004;
        y=11;
        z=4;
        while(!(x==1900&&y==1&&z==1))//DP做法
        {
            if(f[x][y][z]==0)//这个状态为必输,则昨天和上个月必赢
            {
                //day-1的情况
                if(y==1&&z==1)//xxxx.1.1的状态
                    f[x-1][12][31]=1;
                else if(z==1)//xxxx.x.1的状态
                {
                    if(x%4==0&&y==3&&x!=1900)//首先看看是不是闰年的3.1
                        f[x][y-1][mth[y-1]+1]=1;
                    else//不是
                        f[x][y-1][mth[y-1]]=1;
                }else{
                    f[x][y][z-1]=1;//无特殊情况
                }
                //month-1的情况
                //此处无论如何都有一个关于天数的判断,因为有可能出现天数越界的情况
                if (y==1)//xxxx.1.xx的情况
                    f[x-1][12][z]=1;
                else if (x%4==0&&x!=1900&&y==3&&z<=mth[2]+1)//看看是不是闰年的3月 
                    f[x][2][z]=1; 
                else if (z<=mth[y-1]) 
                    f[x][y-1][z]=1;
            }
            //转换日期
            if (y==1&&z==1)//xxxx.1.1
            {
                x--;
                y=12;
                z=31;
            } 
            else if (z==1)//xxxx.xx.1
            {
                if (x%4==0&&x!=1900&&y==3)//闰年
                {
                    y=2;
                    z=29;
                }
                else 
                {
                    y--;
                    z=mth[y];
                }
            }
            else //正常情况
                z--;
        }
        for(int i=1;i<=n;i++)
        {
            int x,y,z;
            cin >> x >> y >> z;
            if(f[x][y][z])
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    R语言大小写字母转换
    SparkR(R on Spark)编程指南 含 dataframe操作
    SparkR(R on Spark)编程指南 含 dataframe操作
    R-table和tapply函数
    r table
    多变量频率统计——r
    R语言-查看加载包、卸除加载包及安装包与卸载包
    flask 电子邮件进阶实践-用模板发送163邮件 --
    flask 电子邮件Flask-Mail --
    数据库进阶实践-事件监听 --
  • 原文地址:https://www.cnblogs.com/lujin49/p/13491803.html
Copyright © 2011-2022 走看看