http://codeforces.com/contest/990
简单的排序后贪心问题。
贪心时有两种情况忘了返回i=j-1导致超时一直没过。
改成如下代码后就过了。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXN 100010
int Micro[MAXN*2];
int n,K;
bool cmp(int a, int b)
{
return a<b;
}
int main()
{
// freopen("in.txt","r",stdin);
cin>>n>>K;
for(int i=0;i<n;i++)
cin>>Micro[i];
sort(Micro,Micro + n,cmp);
int flag = 0;
int ans=0;
for(int i=0;i<n;i++)
{
int j=i+1;
while( Micro[i] == Micro[j] )
{
j++;
if( j == n) i=j-1;
if(Micro[j] <= Micro[i] + K && Micro[i]!=Micro[j] && j<n )
{
for(int t=i;t<j-1;t++) Micro[t]=0;//其实没必要清零,可以直接记录答案
i=j-1;
}
else if (Micro[j] > Micro[i] + K) i = j-1;
}
if(Micro[j] <= Micro[i] + K && j<n ){
Micro[i] = 0;
}
}
for(int i=0;i<n;i++){
if(Micro[i]!=0) ans++;
}
cout<<ans<<endl;
return 0;
}
A了之后看了其他人写的代码,逻辑一样,
不过利用了pos更新j下标,代码就漂亮很多。
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int n, k;
int a[200005];
int main() {
while (cin >> n >> k) {
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int res = 0;
for (int i = 0; i < n; i++) {
int pos = upper_bound(a, a + n, a[i]) - a;
if (pos < n && a[pos] <= a[i] + k) {
} else {
res++;
}
}
cout << res << endl;
}
return 0;
}