最大设置使得对于任何两个点,距离是非整数

时间:2014-02-17 15:29:23

标签: algorithm computational-geometry

我正在尝试解决此问题:http://codeforces.com/problemset/problem/268/C

  

Manao发明了一个新的数学术语 - 一组漂亮的点。如果满足以下条件,他会在飞机上调用一组点:

     
      
  1. 集合中每个点的坐标是整数。
  2.   
  3. 对于集合中的任何两个点,它们之间的距离是非整数。
  4.         

    考虑满足不等式的所有点(x,y):0≤x≤n; 0≤ÿ≤米; X + Y> 0.选择最大尺寸的子集,使其也是一组漂亮的点。

         

    输入

         

    单行包含两个以空格分隔的整数n和m(1≤n,m≤100)。

         

    输出

         

    在第一行打印一个整数 - 找到的漂亮集的大小k。在接下来的每一行中,k行打印一对空格分隔的整数 - 分别是该集合中一个点的x坐标和y坐标。

         

    如果有多种最佳解决方案,您可以打印其中任何一种。

解决方案看起来非常简单。喜欢这个

#include <cstdio>
main(){
    int i=-1,m,n;
    scanf("%d %d",&m,&n);
    m=(m>n)?n:m;
    printf("%d\n",m+1);
    while(i<m)
        printf("%d %d\n",++i,m-i-1);
}

我无法理解如何到达算法。你能帮忙吗?感谢。

2 个答案:

答案 0 :(得分:4)

该算法基本上采用m和n中较小的一个,并生成min(m,n)+ 1个点,其坐标的形式为(i,min(m,n) - i),对于从0到min的所有i (m,n)。

为什么这样做?我们需要在这里证明两件事:构造的集合很漂亮并且具有最大尺寸。

  1. 考虑所有点(x,y)的子集,其中x和y是整数,0 <= x <= n且0 <= y <= m。子集的最大大小也是一组漂亮的点,只能等于或小于min(m,n)+ 1.

    这可以通过Pigeonhole Principle轻松证明。如果有超过min(m,n)+ 1个点,那么我们可以找到2个相同的x或y坐标并因此具有整数距离的点,这会导致该集合失败。

  2. 从0到min(m,n)的所有i的形式(i,min(m,n) - i)的min(m,n)+ 1点的集合是一组漂亮的分。

    这也很容易证明。从集合中选择2个不同的点,其形式为(a,min(m,n)-a)和(b,min(m,n)-b),其中a,b为整数,0 <0。 = a,b <= min(m,n),a不等于b。 2点之间的距离为sqrt((a - b)^ 2 +(b - a)^ 2)= sqrt(2)* abs(a - b),这不是整数。

答案 1 :(得分:0)

1

考虑n * m(n <= m)网格中的n + 1个点:

(0,n),(1,n-1),(2,n-2)...(n-1,1),(n,0)总是漂亮的,其大小为(n + 1)。

2

在n * m(n <= m)网格中,你不能有一个大于(n + 1)的漂亮点集,否则你必须在同一行/ col上放置至少2个点,这样它们之间的距离就是整数。

这两个示例输出看起来令人困惑,但它们实际上是:

3
0 2
1 1
2 0

4
0 3
1 2
2 1
3 0