简单排序+贪心。 一开始用vector做不知道为什么超时。 后改贪心,其中两种情况没有返回 i=j-1;卡了半天。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXN 100010
int Micro[MAXN*2];
int n,K;
int tim=0;
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];
// for(int i=0;i<n;i++){cout<<micro[i]<<" ";}cout<<endl;
sort(Micro,Micro + n,cmp);
// for(int i=0;i<n;i++){cout<<Micro[i]<<" ";}cout<<endl;
int flag = 0;
int ans=0;
for(int i=0;i<n;i++)
{
int j=i+1;
while( Micro[i] == Micro[j] )
{
// cout<<"t:"<<tim++<<endl;
j++;
if( j == n) i=j-1;
if(Micro[j] <= Micro[i] + K && Micro[i]!=Micro[j] && j<n )
{
// cout<<"j:"<<i<<" "<<j<<endl;
for(int t=i;t<j-1;t++) Micro[t]=0;
i=j-1;
// ans++;
}
else if (Micro[j] > Micro[i] + K) i = j-1;
}
if(Micro[j] <= Micro[i] + K && j<n ){
Micro[i] = 0;
}
// cout<<"t:"<<tim++<<endl;
// for(int p=0;p<nn;p++){cout<<micro[p]<<" ";}cout<<endl;
}
for(int i=0;i<n;i++){
if(Micro[i]!=0) ans++;
}
cout<<ans<<endl;
return 0;
}
参考其他代码,有直接用pos记录upper_loader返回值的做法。 另外没有清零,直接对答案进行记录。 代码简洁了很多。




