描述
换寝室是大家都不愿意碰到的事情,不幸的是,可怜的wwm高中大学都遇到了。 室友们有一个不成文的规定,那就是根据自己的学号选择床号。如果某同学的学号是a,并且有0..k-1一共k张床,那么他就会选择a%k号床作为他睡觉的地点。显然,两个人不能睡在一张床上。那么给出所有同学的学号,请你为他们准备一间卧室,使得里面的床的数量最少。
输入
第一行是同学的个数n(1<=n<=5,000);第2到第n+1行是每个同学的学号Si(1<=Si<=1,000,000)。
输出
仅一行,是最少的床的数目。
样例输入
5
4
6
9
10
13
样例输出
8
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int S = 1000001;
const int N = 5001;
char *bed = NULL;
int main()
{
int n;
cin>>n;
int i, j;
vector<int> id(n);
vector<int>::iterator it, it2;
for (it=id.begin(); it!=id.end(); it++)
cin>>*it;
int idMax = *max_element(id.begin(), id.end());
bed = new char[idMax +1];
memset(bed, 0, (idMax+1) * sizeof(bed[0]));
for (it = id.begin(); it != id.end()-1; it++)
for (it2 = it+1; it2 != id.end(); it2++)
bed[abs(*it - *it2)] = 1;
int m = (int)sqrt(idMax);
for (i=2; i <=m; i++)
for (j=n/i; j <= idMax/i; j++)
if (bed[i*j] != 0)
bed[i] = bed[j] = 1;
for (i = n; i <S; i++)
if (bed[i] == 0)
{
cout<< i <<endl;
break;
}
return 0;
}