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;

} 

  

你可能感兴趣的:(1059-搬寝室)