题目地址
代码的错误示范
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
bool cmp(pair<long long int,long long int>a,pair<long long int,long long int>b){
if(a.first!=b.first)return a.first<b.first;
else return a.second<b.second;
}
int main() {
long long int n,r;
long long int counter = 0;
while(cin>>n>>r,n!=0||r!=0){
int boo =0,ans=0;
counter++;
long long int ma=-1,mi=1001;
vector<pair<long long int,long long int> >list;
vector<pair<long long int,long long int> >temp;
for (long long int i = 0; i < n; ++i) {
long long int x,y;
cin>>x>>y;
if(y<mi)mi=y;
if(y>ma)ma=y;
if(y==r){temp.push_back(make_pair(x,y));}
else list.push_back(make_pair(x,y));
}
if(r<=0){
cout<<"Case "<<counter<<": -1"<<endl;
continue;
}
if(ma>r||mi<0){
cout<<"Case "<<counter<<": -1"<<endl;
continue;
}
sort(list.begin(),list.end(),cmp);
sort(temp.begin(),temp.end(),cmp);
list.erase(unique(list.begin(),list.end()),list.end());
temp.erase(unique(temp.begin(),temp.end()),temp.end());
for(vector<pair<long long int,long long int> >::iterator it=temp.begin();it!=temp.end();){
for(vector<pair<long long int,long long int> >::iterator ite=list.begin();ite!=list.end();){
if((ite->first-it->first)*(ite->first-it->first)+ite->second*ite->second<=r*r)ite=list.erase(ite);
else ite++;
}
it = temp.erase(it);
ans++;
}
if(list.empty()){
cout<<"Case "<<counter<<": "<<ans<<endl;
continue;
}
while(!list.empty()){
long long int i = list.begin()->first;
long long int j = (list.end()-1)->first;
vector<pair<long long int,long long int> >fi;
vector<pair<long long int,long long int> >se;
for (;i<=j; ++i) {
for(vector<pair<long long int,long long int> >::iterator ite=list.begin();ite!=list.end();ite++){
if((ite->first-i)*(ite->first-i)+ite->second*ite->second<=r*r)fi.push_back(*ite);
}
if(fi.size()>se.size()){
se=fi;
}
fi.clear();
}
for(vector<pair<long long int,long long int> >::iterator ite=list.begin();ite!=list.end();){
boo = 0;
for(vector<pair<long long int,long long int> >::iterator itx=se.begin();itx!=se.end();){
if(*ite==*itx){
ite=list.erase(ite);
itx = se.erase(itx);
boo = 1;
break;
}
else itx++;
}
if(!boo)ite++;
}
ans++;
se.clear();
}
if(list.empty()){
cout<<"Case "<<counter<<": "<<ans<<endl;
continue;
}
}
return 0;
}
这是我改了好久的而且还WA的题解,可以看到这个东西又臭又长而且STL还随便乱用(虽然离AC很接近了但是因为没办法处理小数的情况所以还是算了//菜是原罪)