Pagini recente » Cod sursa (job #384711) | Cod sursa (job #2751470) | Cod sursa (job #511833) | Cod sursa (job #647518) | Cod sursa (job #2659632)
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;
ifstream fin("infasuratoare.in");
ofstream fout("infasuratoare.out");
struct punct
{
double x,y;
} a[120005];
int n;
vector <punct > rez1;
vector <punct > rez2;
bool cmp(punct a, punct b)
{
if(a.x < b.x)
return true;
else if(a.x == b.x)
{
if(a.y < b.y)
return true;
return false;
}
}
void citire()
{
fin >> n;
for( int i = 0; i < n; i++)
fin >> a[i].x >> a[i].y;
}
int det(punct b,punct c,punct d)
{
return b.x*c.y + c.x*d.y + b.y*d.x -c.x*b.y -d.x*c.y - b.x*d.y;
}
void solve1()
{
sort(a,a + n,cmp);
rez1.push_back(a[0]);
rez1.push_back(a[1]);
for(int i = 2; i < n; i++)
{
if(det(rez1[rez1.size() - 2],rez1[rez1.size() - 1], a[i]) < 0)
rez1.pop_back();
rez1.push_back(a[i]);
}
}
void solve2()
{
rez2.push_back(a[n - 1]);
rez2.push_back(a[n - 2]);
for(int i = n - 3; i >= 0; i--)
{
if(det(rez2[rez2.size() - 2],rez2[rez2.size() - 1], a[i]) < 0)
rez2.pop_back();
rez2.push_back(a[i]);
}
}
void afisare()
{
fout << rez1.size()+ rez2.size() - 2 << "\n";
for( int i = 0; i < rez1.size() - 1 ;i++)
fout <<fixed << setprecision(6) << rez1[i].x <<" " << rez1[i].y << "\n";
for( int i = 0; i < rez2.size() - 1 ;i++)
fout <<fixed << setprecision(6) << rez2[i].x <<" " << rez2[i].y << "\n";
}
int main()
{
citire();
solve1();
solve2();
afisare();
return 0;
}