0 效果
难点:数学运算(指数、绝对值、排序)
1 题目
样例输入1:
3 2 2
2 2
2 3
2 4
样例输出1:
1
2
3
样例输入2:
5 0 1
-1 0
0 0
1 0
0 2
-1 2
样例输出2:
2
4
1
2 思路
逐个计算距离,排序,然后输出前三个。
3 坑
下面写法思路没有错,但是一直爆错:
原因在于:
std::vector<std::pair<int, double>>dis;
经过逐语句提交测试,测出这句话爆出的错误,但是我一直没有找到出错原因,头文件我也包含了,但是还是出错。
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<utility>
#include<vector>
bool cmp(const std::pair<int, double>a,const std::pair<int, double>b){
if(a.second != b.second){
return a.second < b.second;
}else{
return a.first < b.first;
}
}
int main(){
int n;
int x, y;
scanf("%d%d%d", &n, &x, &y);
std::vector<std::pair<int, double>>dis;
int index = 1;
while(n--){
int x1,y1;
scanf("%d%d", &x1, &y1);
std::pair<int, double> tempDis;
tempDis.first = index;
index++;
tempDis.second = pow(abs(x - x1), 2) + pow(abs(y - y1), 2);
dis.push_back(tempDis);
}
std::sort(dis.begin(), dis.end(), cmp);
for(int i = 0;i < 3;i++){
if(i != 0){
printf("\n");
}
printf("%d", dis[i].first);
}
return 0;
}
4 解决方法
使用struct代替pair
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<utility>
#include<vector>
typedef struct Data{
int first;
double second;
}Data;
bool cmp( Data a,const Data b){
if(a.second != b.second){
return a.second < b.second;
}else{
return a.first < b.first;
}
}
int main(){
int n, x, y;
scanf("%d%d%d", &n, &x, &y);
std::vector<Data>dis;
int index = 1;
while(n--){
int x1,y1;
scanf("%d%d", &x1, &y1);
Data tempDis;
tempDis.first = index;
index++;
tempDis.second = std::pow(std::abs(x - x1)*1.0, 2.0) + std::pow(std::abs(y - y1)*1.0, 2.0);
dis.push_back(tempDis);
}
std::sort(dis.begin(), dis.end(), cmp);
for(int i = 0;i < 3;i++){
if(i != 0){
printf("\n");
}
printf("%d", dis[i].first);
}
return 0;
}