题意:培养了 N 个细菌,大的可以吃小的,但有个常数 K 来限制。问最后剩下几只细菌。
大的吃小的,必须满足这个条件才能吃:
ai>aj && ai≤aj+K.
举例说明:
a=[101, 53, 42, 102, 101, 55, 54] and K=1
[101,53,42,102,101––––,55,54] → [101,53–––,42,102,55,54] → [101––––,42,102,55,54] → [42,102,55,54–––] → [42,102,55]
其实说的是 数组前后两个数字的大小关系 是否满足 ai>aj && ai≤aj+K
有序的条件下可以从前往后操作,不用向上面的数组来回跳跃寻找。
sort 之后 可以根据 ai>aj && ai≤aj+K 来减少数量。
需要注意:当 101 被 102 吃掉的时候是 两只 101 的细菌都被吃掉。
引入一个数组 b[a[]] 来计算 a[i] 体积大小的细菌有几只。
当 a[i] 被吃掉 就从总数里减去 a[i] 的总量。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n,k;
int a[200005];
int b[1000005];
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
b[a[i]]++;
}
sort(a,a+n);
memset(b,0,sizeof(b));
int i=0,j=1,cnt=n;
while(j<=n-1){
if(a[j]==a[i]+k){
if(a[i]==a[j]){
i++;
j++;
continue;
}else{
cnt=cnt-b[a[i]];
i++;
j++;
}
}else{
i++;
j++;
}
}
cout<<cnt<<endl;
return 0;
}// 7 1
//101 53 42 102 101 55 54
//3