Pagini recente » Cod sursa (job #1147386) | Cod sursa (job #1639847) | Cod sursa (job #1800071) | Cod sursa (job #326525) | Cod sursa (job #690091)
Cod sursa(job #690091)
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <stack>
#define nMax 120010
#define infinit 2000000000
using namespace std;
struct pct{
double x;
double y;
double panta;
}puncte[nMax];
int n;
int stiva[nMax];
int nStiva;
struct cmp{
bool operator() (const pct &a, const pct &b)const{
return a.panta > b.panta;
}
};
inline double Panta(pct a, pct b){
if(a.x == b.x){
return infinit;
}
return (a.y - b.y)/(a.x - b.x);
}
inline double determinant(pct a, pct b, pct c){
return a.x * b.y + a.y * c.x + b.x * c.y - b.y * c.x - c.y * a.x - a.y * b.x;
}
void citire()
{
int max = 0; // am fol max ca imi place culoarea
ifstream fin("infasuratoare.in");
fin >> n;
for (int i = 0; i < n; ++ i){
fin >> puncte[i].x >> puncte[i].y;
if (puncte[max].x >= puncte[i].x){
if (puncte[max].x == puncte[i].x){
if( puncte[max].y >= puncte[i].y){
max = i;
}else{
continue;
}
}
max = i;
}
}
for (int i = 0; i < n; ++ i){
puncte[i].panta = Panta(puncte[max],puncte[i]);
}
puncte[max].panta = infinit + 1;
sort(puncte, puncte + n, cmp());
}
void rez()
{
stiva[nStiva ++] = 0;
stiva[nStiva ++] = 1;
for(int i = 2; i < n; ++ i){
while (determinant (puncte[stiva[nStiva - 1]], puncte[stiva[nStiva - 2]], puncte[i]) < 0){
nStiva --;
}
stiva[nStiva ++] = i;
}
printf ("%d\n", nStiva);
printf("%lf %lf\n",puncte[stiva[0]].x, puncte[stiva[0]].y);
for (int i = nStiva - 1; i > 0; -- i){
printf("%lf %lf\n",puncte[stiva[i]].x, puncte[stiva[i]].y);
}
}
int main()
{
//freopen ("infasuratoare.in", "r", stdin);
freopen ("infasuratoare.out", "w", stdout);
citire();
rez();
return 0;
}