南邮 OJ 1059 搬寝室

搬寝室

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 1216            测试通过 : 166 

比赛描述

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

题目来源

wwm




#include<iostream>
#include<cmath>
#include<algorithm>
#define MAX_N 5010
#define MAX_S 1000010
using namespace std;

int main(){
	int i,j,m,n;
	cin>>n;
	long s[MAX_N],max_s=0;
	bool bed_no[MAX_S]={0};			//等于1表示床数不可用
	for(i=0;i<n;++i){
		cin>>s[i];
		if(max_s<s[i])
			max_s = s[i];			//记录最大的学号,测试的床数∈[n,mmax_s]
	}
	for(i=0;i<n-1;++i){
		for(j=i+1;j<n;++j){
			bed_no[abs(s[i]-s[j])] = 1;	//学号间的差值不可用
		}
	}
	m = (int)sqrt((double)max_s); 
	for(i=2;i<=m;++i){
		for(j=n/i;j<=max_s/i;++j){		//测试的床数∈[n,mmax_s]
			if(bed_no[i*j])
				bed_no[i]=bed_no[j]=1;	//不可用的数字,它所有的约数都不能用
		}
	}
	for(i=n;i<=max_s;++i){
		if(!bed_no[i]){
			cout<<i<<endl;
			return 0;
		}
	}
}






你可能感兴趣的:(ACM,搬寝室,南邮OJ)