1059-搬寝室
描述
换寝室是大家都不愿意碰到的事情,不幸的是,可怜的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; }