http://codeforces.com/problemset/problem/898/D
题意:有n个闹钟,每个闹钟在第ai分钟响起并持续一分钟。如果在连续的m分钟内有至少k个闹钟响起,那么你就必须起床。现在为了不用起床,要求关闭最少的闹钟的数量。
题解:进行模拟即可,另开数组存已经开启的闹钟。
代码:
#include<bits/stdc++.h>
#define debug cout<<"aaa"<<endl
#define d(a) cout<<a<<endl
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define MIN_INT (-2147483647-1)
#define MAX_INT 2147483647
#define MAX_LL 9223372036854775807i64
#define MIN_LL (-9223372036854775807i64-1)
using namespace std;
const int N = 200000 + 5;
const int M = N * N + 5;
const int mod = 1000000000 + 7;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
int main(){
int n,m,k;
int ans=0;
int a[N],b[N];
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1,j=1;i<=n;i++){
//尝试打开第i个闹钟
b[j]=a[i];
//已开启的闹钟不满k个||第一个和第k个闹钟相隔超过了时间m
if(i<k||b[j]-b[j-k+1]>=m){
j++;
}
else{
ans++;
}
}
cout<<ans<<endl;
return 0;
}