8637. Сортировка точек
Заданы координаты n точек
на плоскости. Вывести их в порядке возрастания сумм координат. В случае равной суммы координат точки
следует отсортировать по возрастанию абсциссы.
Вход.
Каждая строка содержит
пару чисел x, y (0 ≤ x, y ≤ 109) – координаты точки.
Выход. Вывести координаты точек в порядке
возрастания сумм координат. Координаты каждой точки выводить в отдельной
строке.
Пример
входа |
Пример
выхода |
3 4 1 2 5 1 3 3 2 1 |
1 2 2 1 3 3 5 1 3 4 |
сортировка
Объявим структуру Point, содержащую абсциссу x и ординату y точки. Реализуем компаратор согласно условию задачи. Отсортируем и выведем
точки.
Объявим структуру точка – Point.
struct Point
{
public:
int x,
y;
Point(int x, int y) :
x(x), y(y) {}
};
Объявим вектор точек.
vector<Point>
p;
Функция f является компаратором. Точки сортируем в порядке возрастания сумм координат. В случае равной суммы координат точки сортируем по возрастанию абсциссы.
int f(Point a, Point b)
{
if (a.x + a.y ==
b.x + b.y) return a.x
< b.x;
return a.x + a.y
< b.x + b.y;
}
Основная
часть программы. Читаем входные точки.
while (scanf("%d
%d", &x, &y) == 2)
p.push_back(Point(x,
y));
Сортируем
точки.
sort(p.begin(), p.end(), f);
Выводим
отсортированные точки.
for (i = 0; i < p.size(); i++)
printf("%d
%d\n", p[i].x, p[i].y);
#include <cstdio>
#include <vector>
using namespace std;
int a, b, i, n;
struct Point
{
public:
int x, y;
Point(int x, int y) :
x(x), y(y) {}
};
vector<Point>
m;
int f(Point a, Point b)
{
if (a.x + a.y ==
b.x + b.y) return a.x
< b.x;
return a.x + a.y
< b.x + b.y;
}
int left(int i)
{
return 2 * i;
}
int right(int i)
{
return 2 * i + 1;
}
void swap(int &i, int
&j)
{
int temp = i; i = j; j =
temp;
}
// max - heap
void heapify(vector<Point>
&a, int i, int n, int f(Point a, Point b))
{
int largest = 0;
int l = left(i);
int r = right(i);
if (l <= n
&& f(a[i], a[l]))
largest = l;
else
largest = i;
if (r <= n
&& f(a[largest], a[r]))
largest = r;
if (largest != i)
{
swap(a[i], a[largest]);
heapify(a,
largest, n, f);
}
}
void BuildHeap(vector<Point>
&a, int n, int f(Point a, Point b))
{
for (int i = n / 2;
i > 0; i--)
heapify(a, i, n, f);
}
void HeapSort(vector<Point>
&a, int n, int f(Point a, Point b))
{
BuildHeap(a, n, f);
for (int i = n; i
>= 2; i--)
{
swap(a[1], a[i]);
heapify(a, 1,
i - 1, f);
}
}
int main(void)
{
m.push_back(Point(0,
0));
while
(scanf("%d %d", &a, &b) == 2)
m.push_back(Point(a,
b));
HeapSort(m, m.size() - 1,
f);
for (i = 1; i <
m.size(); i++)
printf("%d
%d\n", m[i].x, m[i].y);
return 0;
}
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int i, n, a, b;
struct Point
{
public:
int x, y;
Point() {}
Point(int x, int y) :
x(x), y(y) {}
};
vector<Point> lst;
int f(Point a, Point b)
{
if (a.x
+ a.y == b.x + b.y) return a.x < b.x;
return a.x
+ a.y < b.x + b.y;
}
void merge(vector<Point> &a, int
bleft, int bright, int cleft, int
cright)
{
//
a[bleft..bright] and a[cleft..cright] are merged into a[bleft..cright]
int i, left =
bleft, len = cright - bleft + 1;
Point *res = new
Point[len];
for (i = 0; i <
len; i++)
{
if
((bleft > bright) || (cleft > cright)) break;
if
(f(a[bleft], a[cleft])) res[i] = a[bleft], bleft++;
else
res[i] = a[cleft], cleft++;
}
while
(bleft <= bright) res[i++] = a[bleft++];
while
(cleft <= cright) res[i++] = a[cleft++];
for (i = left; i
< left + len; i++) a[i] = res[i - left];
delete[]
res;
}
void mergeSort(vector<Point> &a, int
left, int right)
{
if (left >=
right) return;
int middle = (left
+ right) / 2;
mergeSort(a, left,
middle);
mergeSort(a, middle + 1,
right);
merge(a, left, middle,
middle + 1, right);
}
int main(void)
{
while
(scanf("%d %d", &a, &b) == 2)
lst.push_back(Point(a,
b));
mergeSort(lst, 0,
lst.size() - 1);
for (i = 0; i <
lst.size(); i++)
printf("%d
%d\n", lst[i].x, lst[i].y);
return 0;
}
#include <cstdio>
#include <vector>
using namespace std;
int i, n, a, b;
struct Point
{
public:
int x,
y;
Point(int x, int y) :
x(x), y(y) {}
};
vector<Point>
lst;
int f(Point a, Point b)
{
if (a.x + a.y ==
b.x + b.y) return a.x
< b.x;
return a.x + a.y
< b.x + b.y;
}
void swap(Point
&i, Point &j)
{
Point temp
= i; i = j; j =
temp;
}
int Partition(vector<Point>
&m, int L, int R)
{
Point x = m[L];
int i = L - 1,
j = R + 1;
while (1)
{
do j--;
while (f(x, m[j]));
do i++;
while (f(m[i],
x));
if (i
< j) swap(m[i], m[j]); else return j;
}
}
void QuickSort(vector<Point>
&m, int L, int R)
{
if (L <
R)
{
int q =
Partition(m, L, R);
QuickSort(m, L, q);
QuickSort(m, q + 1, R);
}
}
int main(void)
{
while
(scanf("%d %d", &a, &b) == 2)
lst.push_back(Point(a,
b));
QuickSort(lst,
0, lst.size() - 1);
for (i =
0; i < lst.size(); i++)
printf("%d
%d\n", lst[i].x,
lst[i].y);
return 0;
}
import java.util.*;
class Point
{
int x, y;
public
Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
public class Main
{
public static class
MyFun implements Comparator<Point>
{
public int
compare(Point a, Point b)
{
if (a.x + a.y == b.x + b.y) return a.x - b.x;
return a.x + a.y - b.x - b.y;
}
}
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
Vector<Point> p = new
Vector<Point>();
while(con.hasNext())
{
int x = con.nextInt();
int y = con.nextInt();
p.add(new
Point(x,y));
}
Collections.sort(p, new
MyFun());
for(int i = 0;
i < p.size(); i++)
System.out.println(p.get(i).x + "
" + p.get(i).y);
con.close();
}
}