我正在尝试解决此问题:http://codeforces.com/problemset/problem/268/C
Manao发明了一个新的数学术语 - 一组漂亮的点。如果满足以下条件,他会在飞机上调用一组点:
- 集合中每个点的坐标是整数。
- 对于集合中的任何两个点,它们之间的距离是非整数。
醇>考虑满足不等式的所有点(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);
}
我无法理解如何到达算法。你能帮忙吗?感谢。
答案 0 :(得分:4)
该算法基本上采用m和n中较小的一个,并生成min(m,n)+ 1个点,其坐标的形式为(i,min(m,n) - i),对于从0到min的所有i (m,n)。
为什么这样做?我们需要在这里证明两件事:构造的集合很漂亮并且具有最大尺寸。
考虑所有点(x,y)的子集,其中x和y是整数,0 <= x <= n且0 <= y <= m。子集的最大大小也是一组漂亮的点,只能等于或小于min(m,n)+ 1.
这可以通过Pigeonhole Principle轻松证明。如果有超过min(m,n)+ 1个点,那么我们可以找到2个相同的x或y坐标并因此具有整数距离的点,这会导致该集合失败。
从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