@中文题意@

n*m的矩阵,当两个点(x1, y1)与(x2, y2)曼哈顿距离为3时可以将两个点匹配。每个点只能够与一个点匹配。求最多能可以匹配多少个点。
n,m <= 10^9

(xi,yi) and (xj,yj) is defined as |xi−xj|+|yi−yj|.

@分析@

【这种题也只能够手算小数据来找规律……】
首先弄清楚一个上界:对于任意的n∗mn∗m n*mn∗m矩阵,如果n与m都为奇数,则答案最大为nm-1;否则答案最大为nm。
不妨假设n <= m。
当 n = 1 的时候,我们只能横着进行匹配。我们手算几组数据,可以用如下图的方法可以把1∗61∗6 1*61∗6所有点都匹配。

再手算几组,我们发现这样一个规律:对于任意一个1∗m1∗m 1*m1∗m,如果m%6<=3,则能匹配的点数为m-m%6;否则能匹配的点数为m-6+m%6。
【具体的证明应该可以用归纳法证明,请容许我偷一下懒qwq】

当 n = 2 的时候。2∗22∗2 2*22∗2显然无解,2∗32∗3 2*32∗3的矩阵中间那一列的元素没有任何元素能跟它们匹配,所以最大匹配点数也只能为4。2∗42∗4 2*42∗4,2∗52∗5 2*52∗5可以采用下列所示的方法全部匹配完。

2∗62∗6 2*62∗6矩阵可以把它拆成两个1∗61∗6 1*61∗6的矩阵,每个矩阵内部可以全部匹配完。
然后!学长们就是被2∗72∗7 2*72∗7的矩阵卡掉了。实际上2∗72∗7 2*72∗7不能构造出全部匹配的情况的。如图:两个蓝色块只能与两个紫色块匹配,所以紫色块只能与蓝色块匹配。同理,两个红色块只能与两个棕色块匹配,所以棕色块只能与红色块匹配。然后有一个块既要和蓝色块匹配又要和棕色块匹配,所以不可能~

所以2∗72∗7 2*72∗7最多只能配对12个点。
然后,最关键的来了。对于一个2∗m2∗m 2*m2∗m(m>=7),如果m为偶数,我们可以把m拆成若干个4与6的和,即将原矩阵拆成若干个2∗42∗4 2*42∗4矩阵与2∗62∗6 2*62∗6矩阵。对于这些矩阵我们可以把所有点匹配完,所以我们自然也就可以匹配完2∗m2∗m 2*m2∗m的所有点;反之,如果m为奇数,我们可以先将2∗m2∗m 2*m2∗m分成2∗52∗5 2*52∗5与2∗(m−5)2∗(m−5) 2*(m-5)2∗(m−5)两个部分,2∗52∗5 2*52∗5可以匹配完。又因m-5是个偶数,所以奇数也可以得到相似的结论。
即:2∗m(m>=7)2∗m(m>=7) 2*m(m&gt;= 7)2∗m(m>=7)的矩阵,答案总可以达到上界2∗m2∗m 2*m2∗m

下一步,当n = 3的时候。
3∗33∗3 3*33∗3,3∗43∗4 3*43∗4,3∗53∗5 3*53∗5的构造如下:

3∗63∗6 3*63∗6就可以分成3个1∗61∗6 1*61∗6拼出,就不画图了。
于是,对于一个3∗m3∗m 3*m3∗m的矩阵,一样地,如果m是偶数,就将m拆成若干个4与6的和;否则就拆成(m-3)与3。所以,3∗m(m>=3)3∗m(m>=3) 3*m(m&gt;=3)3∗m(m>=3)的答案也总是可以达到上界

对于n = 4,我们已知4∗24∗2 4*24∗2,4∗34∗3 4*34∗3可以构造出来。4∗44∗4 4*44∗4可以拆成两个4∗24∗2 4*24∗2。类似的推理,4∗m(m>=4)4∗m(m>=4) 4*m(m&gt;=4)4∗m(m>=4)的答案总可以达到上界。

对于n = 5,我们已知5∗25∗2 5*25∗2,5∗35∗3 5*35∗3,5∗45∗4 5*45∗4可以构造出来。因此5∗m(m>=5)5∗m(m>=5) 5*m(m&gt;=5)5∗m(m>=5)的答案总可以达到上界。

对于n = 6,我们已知6∗16∗1 6*16∗1可以构造出来。因此6∗m(m>=6)6∗m(m>=6) 6*m(m&gt;=6)6∗m(m>=6)的答案总可以达到上界。

然后,对于n>6。如果n为偶数,可以把n拆成若干个4与6的和;否则如果m为偶数,可以把n拆成若干个4与6的和;否则,可以把n拆成(n-3)与3,然后重复上面的推理。因此n∗m(n>6,m>n)n∗m(n>6,m>n) n*m(n&gt;6, m&gt;n)n∗m(n>6,m>n)的答案总可以达到上界。

至此,本题就Over了。

@代码@

#include<cstdio>
#include<algorithm>
using namespace std;
int main() {
int n, m;
scanf("%d%d", &n, &m);
if( n > m ) swap(n, m);
if( n == ) {
if( m % == )
printf("%d\n", m);
else if( m % <= )
printf("%d\n", m-(m%));
else printf("%d\n", m-(-m%));
}
else if( n == && m == )
printf("%d\n", );
else if( n == && m == )
printf("%d\n", );
else if( n == && m == )
printf("%d\n", );
else {
if( n % == && m % == )
printf("%I64d\n", 1LL*n*m-);
else printf("%I64d\n", 1LL*n*m);
}
}

另外解法:

这道题…

可以说是打表吧

首先我们可以观察到,对于任意一个1∗61∗6 1*61∗6或者2∗42∗4 2*42∗4的格子,都是可以填满的,

那也就说如果有一边长能被6或者4给整除,那就是可以填满的

然后对于5*5以下的了,我们可以直接打表预处理出来(因为有一些特殊情况吧)

#include<bits/stdc++.h>

using namespace std ;
int D[][]={ {,,,,},
{,,,,},
{,,,,},
{,,,,},
{,,,,}};
int main( )
{
int n,m;
scanf("%d%d",&n,&m);
if(n<m)
swap(n,m);
long long ans=;
if(m==)
{
ans+=n/*;
n=n%;
ans+=D[][n-];
}
else if(n%== || m%==)
ans=(long long )n*m;
else if(n%== || m%==)
ans=(long long )n*m;
else if(n==&&m==)
ans=;
else if(n<=&&m<=)
ans=D[n-][m-];
else
ans=(long long )n*m/*;
printf("%I64d\n",ans);
return ;
}

【CodeForces - 1034B】Little C Loves 3 II的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【23.39%】【codeforces 558C】Amr and Chemistry

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. 【15.07%】【codeforces 625A】Guest From the Past

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  4. 【30.49%】【codeforces 569A】Music

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. 【32.89%】【codeforces 574D】Bear and Blocks

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. 【25.00%】【codeforces 584E】Anton and Ira

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. 【22.70%】【codeforces 591C】 Median Smoothing

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  9. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

随机推荐

  1. java判断姓是否合格 千家姓

    package com.sycx.domain; import java.lang.reflect.Array; public class FirstName { public static bool ...

  2. Acviticy.this 和 getApplicationContext()的区别

    用AlertDialog 举例 AlertDialog对象是依赖于一个View的,而View是和一个Activity对应的,在Activity销毁的时候它也就销毁了,不会再存在.Activity.th ...

  3. 激活 jave platform se

    1.有的网页上面会显示这个,但是点击后没反应 解决方案: firefox- >工具-附加组件管理器-“插件” 找到“Java(TM) Platform SE 7”,把“询问是否激活”改为“总是激 ...

  4. CheckBoxJS选中与反选得到Value

    function XuanZe(val) {    datastr = $("#hid_AID").val();    var newstr = "";    ...

  5. actionbar中添加searchview并监听期伸缩/打开的方法

    首先在xml中设置actionviewclass <item android:id="@+id/m1" android:title="setting" a ...

  6. linux终端后台运行

    nohup command &(然后X退出即可) &也可用来在终端中同时执行几条命令(并行,最后面不要忘记加&) command1 & command2 & c ...

  7. Linux 编译安装内核

    一.简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修 ...

  8. Luogu 3943 星空

    原题是CF79D Password 很妙的题. 首先我们发现区间操作不太好弄,我们想办法把它转化成单点操作,这样子处理的办法会多一点. 方法当然是差分了. 定义差分数组$b_i = a_i \^ a_ ...

  9. 树莓派研究笔记(9)-- 树莓派SPI连接TFT屏幕

    HDMI连接和树莓派专用连接的接口的屏幕都太贵了,为了节约成本,现在国内大多数还是TFT屏幕. 树莓派可以激活SPI接口,通过代码驱动TFT屏幕的显示.这样利用树莓派zero 打造小型的游戏平台可以大 ...

  10. 树莓派研究笔记(3)-- 安装VNC

    小屏幕太小了,眼睛快看瞎了,必须安装VNC 才行啊. 更新—2018-02-04 最新版本的系统中自带了VNC了,只需要在 菜单 Preferences -> Raspberry Pi Conf ...