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;
} 

  

原文地址:https://www.cnblogs.com/Rosanna/p/3436687.html