题解:CF1551D1 Domino (easy version)

题解:CF1551D1 Domino (easy version)

分析

题目中保证 n×m 为偶数,下面进行分类讨论。

情况一

如果 nm 都是偶数,那么可以分割成 n2×m22×2 的方块。

根据上图我们发现,只要 k 满足 0kn2×m2×22k,就一定可以凑出来。

情况二

如果 n 是奇数,m 是偶数,我们考虑把 n 变为偶数转化为第一种情况。

如上图,可以先在第一行排 m2 个多米诺骨牌,这时如果 k<m2 就无解,否则就直接转化为了第一种情况,此时 k 变为 km2

情况三

如果 n 是偶数,m 是奇数,我们考虑把 m 变为偶数转化为第一种情况。

如上图,可以先在第一列排 n2 个多米诺骨牌。由于 k 的限制是横向的多米诺骨牌,所以 k 不变,转换为情况一。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
bool check(int a,int b,int c)
{
    if(c&1)return 0;
    if(c>(a/2)*(b/2)*2)return 0;
    return 1;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>k;
        if(!(n&1)&&!(m&1))
        {
            if(check(n,m,k))
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
        else if((n&1)&&!(m&1))
        {
            if(k<m/2)
            {
                cout<<"NO"<<endl;
                continue;
            }
            k-=m/2;
            n--;
            if(check(n,m,k))
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
        else if(!(n&1)&&(m&1))
        {
            m--;
            if(check(n,m,k))
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}
posted @   Ryan_Adam  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示