奶牛卧室

奶牛卧室

时间限制: 1 Sec  内存限制: 128 MB
提交: 60  解决: 18
[提交][状态][讨论版]

题目描述

奶牛们有一个习惯,那就是根据自己的编号选择床号。如果一头奶牛编号是a,并且有0..k-1一共k张床,那么她就会选择a  mod  k号床作为她睡觉的地点。显然,2头牛不能睡在一张床上。那么给出一些奶牛的编号,请你为她们准备一间卧室,使得里面的床的个数最少。

输入

第一行是奶牛的个数n(1<=n<=5000);第2到第n+1行是每头奶牛的编号Si(1<=Si<=1000000)。

输出

仅一行,是最少的床的数目。

样例输入

5
4
6
9
10
13

样例输出

8
【分析】a%k!=b%k 即(a-b)%k!=0,所以排除所有的差,若某个k不是其中的差,但是他的倍数是其中的差,也要排除,然后就是找了
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include<functional>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int N=1000005;
const int M=15005;
int vis[N],b[N];
int main(){
    int n,p,k;
    scanf("%d",&n);
    for(int i = 0; i < n; i++) scanf("%d",&b[i]);
    sort(b,b+n);
    for(int i = 0; i < n-1; i++) for(int j = i+1; j < n; j++) vis[b[j]-b[i]] = 1;
    for(k = 2; k <= b[n-1]; k++){
        bool flag = false;
        int j;
        if(vis[k]) continue;
        p = k*2;
        while(p <= b[n-1]){
            if(vis[p]){ flag = true; break; }
            p += k;
        }
        if(!flag) break;
    }
    printf("%d
",k);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/jianrenfang/p/5751842.html