Pagini recente » Cod sursa (job #3286112) | Cod sursa (job #1685623) | Cod sursa (job #2434920) | Cod sursa (job #147983) | Cod sursa (job #3299465)
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 120000
struct infasor
{
float x, y;
}v[MAXN + 1];
int stiva[MAXN + 1];
int stiva2[MAXN + 1];
int formula(int a, int b, int c)
{
return v[a].x * v[b].y + v[b].x * v[c].y + v[c].x * v[a].y - v[b].y * v[c].x - v[c].y * v[a].x - v[a].y * v[b].x;
}
bool cmp(infasor a, infasor b)
{
if (a.x < b.x)
{
return true;
}
if (a.x == b.x && a.y < b.y)
{
return true;
}
return false;
}
int main()
{
FILE *fin, *fout;
fin = fopen("infasuratoare.in", "r");
fout = fopen("infasuratoare.out", "w");
int N, i, vf, mini, maxi, vf2;
fscanf(fin, "%d", &N);
for (i = 1; i <= N; i++)
{
fscanf(fin, "%f%f", &v[i].x, &v[i].y);
}
sort(v + 1, v + N + 1, cmp);
for (i = 1; i <= N; i++)
{
if (i == 1)
{
mini = maxi = 1;
}
else
{
if (v[mini].y > v[i].y || (v[mini].y == v[i].y && v[mini].x > v[i].x))
{
mini = i;
}
if (v[maxi].y < v[i].y || (v[maxi].y == v[i].y && v[maxi].x < v[i].x))
{
maxi = i;
}
}
}
vf = 0;
stiva[0] = mini;
for (i = 1; i <= N; i++)
{
if (i != mini && i != maxi && 0 > formula(mini, maxi, i))
{
while (vf > 0 && formula(stiva[vf - 1], i, stiva[vf]) > 0)
{
vf--;
}
stiva[++vf] = i;
}
}
vf2 = 0;
stiva2[0] = maxi;
for (i = N; i >= 1; i--)
{
if (i != mini && i != maxi && 0 < formula(mini, maxi, i))
{
while (vf2 > 0 && formula(stiva2[vf2 - 1], i, stiva2[vf2]) > 0)
{
vf2--;
}
stiva2[++vf2] = i;
}
}
fprintf(fout, "%d\n%f %f\n", vf + vf2 + 2, v[mini].x, v[mini].y);
for (i = 1; i <= vf; i++)
{
fprintf(fout, "%f %f\n", v[stiva[i]].x, v[stiva[i]].y);
}
fprintf(fout, "%f %f\n", v[maxi].x, v[maxi].y);
for (i = 1; i <= vf2; i++)
{
fprintf(fout, "%f %f\n", v[stiva2[i]].x, v[stiva2[i]].y);
}
fclose(fin);
fclose(fout);
return 0;
}