@中文题意@

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. group()、start()、end()、span()

  2. B和strong以及i和em的区别(转)

    B和strong以及i和em的区别 (2013-12-31 13:58:35) 标签: b strong i em 搜索引擎 分类: 网页制作 一直以来都以为B和strong以及i和em是相同的效果, ...

  3. Ros学习——launch文件解析

    launch文件的重点是:节点(node)元素的集合. roslaunch 则是让所有的节点共享同一个终端. 1.标签(元素)说明 1. group标签 2. node标签 <group ns= ...

  4. SpringBoot05 数据操作02 -> JPA接口详解

    概览 JpaRepository 继承 PagingAndSortingRepository 继承 CrudRepository 继承 Repository 1 Repository 这是一个空接口, ...

  5. NSButton添加事件

    -(void)addButton { NSButton* pushButton = [[NSButton alloc] initWithFrame: NSMakeRect(, , , )]; push ...

  6. C++文件流打开标识符.RP

    ofstream流,以ios::app打开(或者“ios::app|ios::out”),如果没有文件,那么生成空文件:如果有文件,那么在文件尾追加.以ios::app|ios::in打开,不管有没有 ...

  7. Bootstrap 的 Dropdown

    一.简介 Dropdown 就是下拉列表,这里 有一个例子. Dropdown 的完整代码如下: <div id="dropdownWrapper"> <butt ...

  8. IIC协议解释

    IIC协议解释 (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量 ...

  9. 循环对XML文档添加Attribute以及移除Element

    如下面的图片要求,需要把左边的xml文改为右边的文档. 需要添加Attribute,移除Element,但是所添加的Attribute值已经跟被移除的Element值不相同.实现方法可以参考<对 ...

  10. c# 字符串填充占位

    C#  字符串PadLeft函数的使用 1.Demo: 需求: 将111改变成0000111 使用字符串PadLeft函数可以解决: int num = 111; string s= num.ToSt ...