C++ – T84891 零件

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

题目

T1

思路

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

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

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

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

代码

#include <cstdio>
#include <algorithm>
#include <bitset>
#include <cmath>
#include <set>
using namespace std;
const int MAXN = 1e5 + 100;
int arr[MAXN];
bitset<MAXN> 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<int> 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;
}

发表回复