奶牛卧室
奶牛卧室
源程序名 BED.???(PAS,C,CPP)
可执行文件名 BED.EXE
输入文件名 BED.IN
输出文件名 BED.OUT
问题描述
奶牛们有一个习惯,那就是根据自己的编号选择床号。如果一头奶牛编号是a,并且有0..k-1一共k张床,那么她就会选择a mod k号床作为她睡觉的地点。显然,2头牛不能睡在一张床上。那么给出一些奶牛的编号,请你为她们准备一间卧室,使得里面的床的个数最少。
输入:
第一行是奶牛的个数n(1<=n<=5000);第2到第n+1行是每头奶牛的编号Si(1<=Si<=1000000)。
输出:
仅一行,是最少的床的数目。
样例
输入BED.IN:
5
4
6
9
10
13
输出BED.OUT:
8
题目不分析了,简单提示一下
若 a1≡b1(mod m),a2≡b2(mod m),则|a1-a2|≡|b1-b2|(mod m)(同余性质)
即如果存在s[i] mod k=s[j] mod k,便一定存在(s[i]-s[j]) mod k=0
所以,问题就迎刃而解了。
1 Var 2 k,Iris,i,j,n:longint; 3 mo:array[0..1000001] of Boolean; 4 s:Array[0..5001] of longint; 5 Begin 6 Read(n); 7 For i:=1 to n do Read(s[i]); 8 For i:=1 to n-1 do 9 For j:=i+1 to n do 10 Begin 11 Mo[abs(s[i]-s[j])]:=True; 12 if abs(s[i]-s[j])>Iris Then Iris:=abs(s[i]-s[j]); 13 End; 14 k:=n; 15 While (k<=Iris) And (mo[k]) do inc(k); 16 Writeln(k); 17 End.