问题分析
第一版(错误)!!!!
对知识掌握不熟练,换一种方法再来。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int n,x,y;
cin>>n>>x>>y;
int ans[300];
int index[300];
for(int i=0;i<n;i++){
int a,b,c;
cin>>a>>b;
c=(x-a)*(x-a)+(y-b)*(y-b);
ans[i]=c;
index[i]=i+1;
}
int temp1,temp2;
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(ans[j]>ans[j+1]){
temp1=ans[j];
ans[j]=ans[j+1];
ans[j+1]=temp1;
temp2=index[j];
index[j]=index[j+1];
index[j+1]=temp2;
}
}
}
for(int i=0;i<3;i++){
//cout<<ans[i]<<" ";
cout<<index[i]<<" ";
}
return 0;
}
第二版(正确!):
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int n,x,y;
int a,b;
cin>>n>>x>>y;
pair <int,int> ans[300];
for(int i=0;i<n;i++){
cin>>a>>b;
int d=(x-a)*(x-a)+(y-b)*(y-b);
ans[i]={d,i};//增加元素
}
sort(ans,ans+n);//对pair front元素从小到大排序
for(int i=0;i<3;i++){
cout<<ans[i].second+1<<endl;//输出前三下标
}
return 0;
}
问题总结
平时我们排序主要是对数组元素排序,相当于直接把下标给扔掉了,但是本题不一样,对数组元素排序的同时还要连带着对下标排序
。
第一次我想使用两个数组来做但是遗憾没过。
第二次使用pair
来做,pair
实质上是一个结构体
,其主要的两个成员变量是first
和second
,这两个变量可以直接使用。
pair
是将2个数据组合成一个数据。
CCF的第一题实则不难,但是使用一种语言还是需要多多了解它的语法以及其他知识用法。