搬寝室
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:962 测试通过:134
总提交:962 测试通过:134
描述
换寝室是大家都不愿意碰到的事情,不幸的是,可怜的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
题目链接http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1059
几乎是照搬了http://www.cnblogs.com/Rosanna/p/3436687.html
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> v(n);
for(int i = 0; i < n; i++){
cin>>v[i];
}
int max = *max_element(v.begin(), v.end());
bool* bed = new bool[max+1];
memset(bed, 0, sizeof(bed[0])*(max+1));
vector<int>::iterator it, it2;
for(it = v.begin(); it!=v.end()-1; it++){
for(it2 = it+1; it2 != v.end(); it2++){
bed[abs(*it-*it2)] = 1;
}
}
int m = (int)sqrt(max);
for(int i = 2; i <= m; i++){
int k = max/i;
for(int j = n/i; j <= k; j++){
if(bed[i*j]==1){
bed[i] = 1;
bed[j] = 1;
}
}
}
for(int i = n; i <=max; i++){
if(bed[i]==0){
cout<<i<<endl;
break;
}
}
return 0;
}