C++ – T84891 零件

题目链接:https://www.luogu.org/problem/T84891

题目

[pdf id=441]

思路

如果零件A与零件B冲突,且零件A与零件C冲突,那么零件B与零件C也是冲突的。

也就是说在零件A、零件B、零件C中,我们只能选出其中一个零件。

而零件A 、零件B、零件C有一个共同的特征,那就是%K后为同一值。

所以只要把所有输入内容%K后塞入一个set,最后输出这个set的大小就可以了。

代码

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int MAXN = 1e5 + 100;
int arr[MAXN];
bitset vis;
int main() {
	vis.reset();
	int n, k;
	scanf("%d %d", &n, &k);
	for(int i = 0; i < n; i++) 
		scanf("%d", &arr[i]);
	//按照惯例,暴力做法注释
//	sort(arr, arr + n);
//	for(int i = 0; i < n; i++) {
//		for(int j = i + 1; j < n; j++) {
//			if(!vis[j]) {
//				if((arr[j] - arr[i]) % k == 0)
//					vis[j] = true;
//			}
//		}
//	}
	set s;
	for(int i = 0; i < n; i++)
		s.insert(arr[i] % k);
//	printf("%d\n", n - vis.count());
	printf("%d\n", s.size());
	return 0;
}

发表回复