【题目描述】
在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。
【输入】
输入文件包含多组测试数据。
第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。
每组数据为三个用空格隔开的整数 N,M,K。

3
3 3 8
4 5 13
7 14 86

【输出】
对于每组测试数据,输出一行"Case #X: Y",其中X表示测试数据编号,Y表示最多能找到的符合条件的长方形数量。所有数据按读入顺序从1开始编号。

Case #1: 5
Case #2: 18
Case #3: 1398

【题解】

首先先考虑对于一个布满点的矩形(x行,Y列),所有的矩形总数为 C(2,x)*C(2,y)。要使数量最多,则x和y要尽可能接近(有最大行和最大列的限制)。    题中所给的K可能不能刚好排成大矩形,可能有多余的几个点,这几个点的数量一定不会超过一行或一列的最大数量。 试想如果超过,则多出来完整的一行或一列可以和原来的大矩形构成更大的矩形,剩下的点就不能构成完整的一行或一列了。
    多余多出来的点,以一排或一列的形式,靠在大矩形短的一边(要注意是否到达边界),设多余K个点,则多增加的矩形数为 C(2,K)*L (L为长边的点数)。

为了简单起见,可以规定行大于列(对调旋转下),枚举 X、Y的有效极大组合,找出最大的结果就行了。

AC代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 int n,m,k;
 5 void swap(int &a,int &b)
 6 {
 7     int t=a;
 8     a=b;
 9     b=t;
10 }
11 long long getc(long long j)
12 {
13     return j*(j-1)/2;
14 }
15 int main()
16 {
17    int T;
18    scanf("%d",&T);
19    int cas=0;
20    while (T--)
21    {
22        scanf("%d%d%d",&n,&m,&k);
23        if (n<m) swap(n,m);
24        int t=sqrt(k);
25        int b=t>m?m:t;
26        int a=k/b>n?n:k/b;
27        long long max=0;
28        for (;b>=2 && a<=n;--b,a=k/b)
29        {
30            long long sum=getc(a)*getc(b);
31            int p=k-a*b;
32            if (a<n)
33            {
34               sum=sum+getc(p)*a;
35            }
36             else
37             {
38                 sum=sum+getc(p)*b;
39             }
40             max=max>sum?max:sum;
41        }
42        printf("Case #%d: %I64d\n",++cas,max);
43    }
44
45  return 0;
46 }

在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子相关推荐

  1. Python -- Matplotlib:画一条水平线或竖直线

    目录 竖直线 水平线 原文链接 https://blog.csdn.net/math_gao/article/details/109592302 竖直线 # 画出 x=2 这条垂直线 plt.axvl ...

  2. html竖直线代码,html添加一条直线 用html代码怎样画一条竖直线?

    需要准备的材料分别有:电脑.chrome浏览器.html编辑器. 首先打开html编辑器,新建一个html文件,例如:index.html. 其次,在index.html的标签中,添加代码:. 浏览器 ...

  3. matlab 一条水平线,matlab画一条水平线

    凸轮廓线的MATLAB画法_工学_高等教育_教育专区.基于matlab的凸轮画法实例 凸轮廓线的 MATLAB 画法 1 凸轮轮廓方程 X ? OE ? EF ? E * Cos( J ) ? ( . ...

  4. 解决css图片和文字不在一条水平线上

    css解决文字和图片不在一条水平线上 通常情况下图片是默认顶部对齐,而文字则是默认底部对齐的,所以我们在布局时经常会遇到图片和文字不能对齐的问题. 解决方法很简单我们只需要给图片添加一条属性即可 im ...

  5. CMD 一条命令 执行 多条命令

    CMD 一条命令 执行 多条命令 如果想一次运行多条命令可能用到的连接符个人了解到的有三个:&&,|| 和 &. aa && bb 含义:执行aa,成功后再执行 ...

  6. mysql 取出20条数据_“取出数据表中第10条到第20条记录”的sql语句+select top 使用方法...

    1.首先.select top使用方法: select * from table --  取全部数据.返回无序集合 select top n * from table -- 依据表内数据存储顺序取前n ...

  7. 用一句SQL取出第 m 条到第 n 条记录的方法

    1 --从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本) 2 3 SELECT TOP n-m+1 * 4 FROM Table 5 WHERE (id NOT IN (SE ...

  8. pgsql 前10条_白沙湾南片区11条新建道路最新进度及建成时间,已建成一条!还有一条将通车...

    原标题:白沙湾南片区11条新建道路最新进度及建成时间,已建成一条!还有一条将通车 近日,@白沙河畔 从流亭街道办事处获悉:为了完善白沙湾南片区及仙家寨南片区路网及基础设施配套,为周边区域提供良好的生活 ...

  9. SQL取出第 m 条到第 n 条记录的方法

    页或者分段调用数据的时候很有用的啊 --从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本) CODE: SELECT TOP n-m+1 * FROM Table WHERE ...

最新文章

  1. Tomcat 1099端口占用重启无效,查不到进程,改换端口无效解决方案
  2. eclipse 无法使用注解的两个解决方法
  3. Spring Boot集成CKEditor
  4. 【网络安全】一些webshell免杀的技巧
  5. win10弹不出密码输入框_电脑互访提示输入网络密码,怎么办?
  6. java 类的执行顺序_Java中类的执行顺序
  7. c语言 %-20s,一次 Rust 和C语言的混搭
  8. 全局模式下的正则表达式
  9. 360公司2019秋季校园招聘内部推荐启动啦!!!
  10. [设计模式-结构型]装饰模式(Decorator)
  11. python之列表生成式
  12. 开发环境eclipse for Mac 下的常用快捷键汇总(基本参照Win系,将Ctrl换为Command)
  13. Pytorch专题实战——激活函数(Activation Functions)
  14. android:Read-only file system解决
  15. getSelectionStart() doesn't work in android, is always 0
  16. 亦是美网络,致力于操作系统应用与计算机网络技术的IT网站。
  17. 用Python画哆啦A梦
  18. Python图片添加水印修改MD5值
  19. LCS(longest common sequence)算法的实现(十分详细)
  20. MAC 地址以及它的单播、多播、组播

热门文章

  1. latex 特殊符号
  2. 美国-5大牛校--8条小牛--14好校--18很不错的大学
  3. python互相转换组合_Python基本类型的连接组合和互相转换方式(13种)
  4. Redis的常用命令——hash的常用命令
  5. php 简单的解密和加密
  6. Jenkins 服务重启方法
  7. matlab unique函数
  8. Set常用用法元素检索
  9. 高精度数取余(C\C++)
  10. 模拟Sum函数(版本二)