描述 Description
奶牛们有一个习惯,那就是根据自己的编号选择床号。如果一头奶牛编号是a,并且有0..k-1一共k张床,那么她就会选择a mod k号床作为她睡觉的地点。显然,2头牛不能睡在一张床上。那么给出一些奶牛的编号,请你为她们准备一间卧室,使得里面的床的个数最少。
输入格式 Input Format
第一行是奶牛的个数n(1<=n<=5000);第2到第n+1行是每头奶牛的编号Si(1<=Si<=1000000)。
输出格式 Output Format
仅一行,是最少的床的数目。
样例输入 Sample Input
5
4
6
9
10
13
样例输出 Sample Output
8
时间限制 Time Limitation
1s
注释 Hint
1s
来源 Source
未知
(这道题非常的水..........(OJ上的数据才水.......))
第一次写数论题,也刚刚开始学,读题可知就是让你求(a-b)mod m=0求这个m的最小值,使得m不为任何一个差的约数
所以刚开始先sort排序一遍,求出每两个数之间的差数,然后求出最小的m即可。这样一来不是直接bool型数组判断没两
个数之间的约数使f[a[j]-a[i]]=true;然后在扫一遍不就完啦!!(这么水吗)但是你发现你只拿到了90分,
为什么被挖了一组呢因为如果这两个数的倍数也为差数,那么这个m也不成立了哇,所以在判断一下这个
数的约数是不是其他两个数的差即可了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 inline int read() 8 { 9 int x=0,f=1; 10 char ch=getchar(); 11 while(ch>'9'||ch<'0') 12 { 13 if(ch=='-') 14 f=-1; 15 ch=getchar(); 16 } 17 while(ch<='9'&&ch>='0') 18 { 19 x=x*10+ch-'0'; 20 ch=getchar(); 21 } 22 return x*f; 23 } 24 int a[5100]; 25 bool vis[1001000]; 26 int main() 27 { 28 int n; 29 n=read(); 30 for(int i=1;i<=n;i++) 31 { 32 a[i]=read(); 33 } 34 int ans=0; 35 sort(a+1,a+1+n); 36 for(int i=1;i<n;i++) 37 { 38 for(int j=i+1;j<=n;j++) 39 { 40 vis[a[j]-a[i]]=1; 41 } 42 } 43 /*for(int i=1;i<=a[n];i++)90分算法 44 if(!vis[i]) 45 { 46 cout<<i<<endl; 47 break; 48 }*/ 49 int h; 50 for(int i=2;i<=a[n];i++) 51 { 52 bool flag=false; 53 if(vis[i]) 54 continue; 55 h=i*2; 56 while(h<a[n])//判断这个数的倍数是不是任意两个数的差 57 { 58 if(vis[h]) 59 { 60 flag=true; 61 break; 62 } 63 h+=i; 64 } 65 if(!flag) 66 { 67 ans=i; 68 break; 69 } 70 } 71 cout<<ans<<endl; 72 return 0; 73 }