码蹄杯 买马 题型:枚举 难度:黄金

147 阅读1分钟

码题集OJ-买马 (matiji.net)

image.png

样例输入:

3
1
2
6

样例输出:

3

思想

先说一下这道题的做法,因为n最大不会超过100,因此我们可以去暴力枚举k,对于每个k我们都检查一下是否合法,遇到合法的k就输出k,然后结束循环。

所谓合法的k就是说所有马的编号在经过modk操作之后保证没有两匹马在一个马槽的情况。

因为有n匹马,所以至少有n个马槽。所以我们的k至少是n,最大不能超过马的最大编号(即不超过1000)

我们首先对数字去个重,去重的原因题目要求每匹马在经过modk操作之后都有一间马槽,如果不去重,那么两个同样的数经过modk操作之后会在一个马槽里。

注意

set这里放全局会超时的。

原因:

image.png

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

image.png

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

image.png