样例输入:
3
1
2
6
样例输出:
3
思想
先说一下这道题的做法,因为n最大不会超过100,因此我们可以去暴力枚举k,对于每个k我们都检查一下是否合法,遇到合法的k就输出k,然后结束循环。
所谓合法的k就是说所有马的编号在经过modk操作之后保证没有两匹马在一个马槽的情况。
因为有n匹马,所以至少有n个马槽。所以我们的k至少是n,最大不能超过马的最大编号(即不超过1000)
我们首先对数字去个重,去重的原因题目要求每匹马在经过modk操作之后都有一间马槽,如果不去重,那么两个同样的数经过modk操作之后会在一个马槽里。
注意
set这里放全局会超时的。
原因:
#include <bits/stdc++.h>
using namespace std;
int n;
set<int>haxi;
int cnt;
int a[110];
bool check(int mod) {
for (int i = 1; i <= cnt; i++) {
int t = a[i] % mod;
if (haxi.count(t))
return false;
else
haxi.insert(t);
}
return true;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
cnt = unique(a + 1, a + n + 1) - a - 1;
for (int k = n;; k++) {
if (check(k)) {
cout << k << endl;
break;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n;
set<int>haxi;
int cnt;
int a[110];
bool check(int mod) {
for (int i = 1; i <= cnt; i++) {
int t = a[i] % mod;
if (haxi.count(t))
return false;
else
haxi.insert(t);
}
return true;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
//使用unique之前需要保证单调递增
sort(a + 1, a + n + 1);
cnt = unique(a + 1, a + n + 1) - a - 1; //去重
for (int k = n;; k++) {
if (check(k)) {
cout << k << endl;
break;
}
}
return 0;
}