Go to diff to previous submission
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <string> #include <map> #include <vector> #include <algorithm> int i, j, k; int i2, j2, k2; struct vertex { double x, y; }; bool cmpv(const vertex &a, const vertex &b) { if (a.x < b.x) return true; if (a.x == b.x && a.y > b.y) return true; return false; } int vcount; std::vector<vertex> v; std::vector<vertex> o; bool right(vertex& v1, vertex& v2, vertex& v3) { double x1 = v2.x - v1.x; double y1 = v2.y - v1.y; double x2 = v3.x - v1.x; double y2 = v3.y - v1.y; return (x1*y2 - x2*y1) < 0.0f; } void obalka() { o.clear(); if (vcount > 0) o.push_back(v[0]); if (vcount > 1) o.push_back(v[1]); for (i = 2; i < vcount; i++) { while (!right(o[o.size()-2], o[o.size()-1], v[i])) { //printf("vyhazuju %0.1f %0.1f\n", o.back().x, o.back().y); o.pop_back(); if (o.size() == 1) { break; } } o.push_back(v[i]); //printf("pridavam %0.1f %0.1f\n", o.back().x, o.back().y); } for (i = vcount-1; i >= 0; i--) { while (!right(o[o.size()-2], o[o.size()-1], v[i])) { // printf("vyhazuju %0.1f %0.1f\n", o.back().x, o.back().y); o.pop_back(); if (o.size() == 1) { break; } } o.push_back(v[i]); //printf("pridavam %0.1f %0.1f\n", o.back().x, o.back().y); } /* for (int i = 0; i < (int)o.size(); i++) { printf("o: %.1f %.1f\n", o[i].x, o[i].y); } printf("///\n"); */ } void obdelnik() { double minx, maxx, miny, maxy; double minobsah = 100000000000.f; double sx, sy, nx, ny; for (int i = 0; i < (int)o.size()-1; i++) { minx = 10000000000.f; miny = 10000000000.f; maxx = -10000000000.f; maxy = -10000000000.f; sx = o[i+1].x - o[i].x; sy = o[i+1].y - o[i].y; double invlen = 1.f / sqrt(sx * sx + sy * sy); sx *= invlen; sy *= invlen; nx = sy; ny = -sx; double x, y; for (int j = 0; j < (int)o.size(); j++) { x = o[j].x * sx + o[j].y * sy; y = o[j].x * nx + o[j].y * ny; minx = std::min(x, minx); miny = std::min(y, miny); maxx = std::max(x, maxx); maxy = std::max(y, maxy); } minobsah = std::min(minobsah, 2 * (maxx - minx) + 2 * (maxy - miny)); } printf("%lf\n", minobsah); } /* ------------------------------- */ int main() { while (scanf("%d", &vcount) == 1) { v.clear(); v.reserve(vcount); for (i = 0; i < vcount; i++) { vertex vnew; scanf("%lf%lf", &vnew.x, &vnew.y); v.push_back(vnew); } std::sort(v.begin(), v.end(), cmpv); /* for (i = 0; i < vcount; i++) { printf("%lf %lf\n",v[i].x, v[i].y); } printf("--\n"); */ obalka(); obdelnik(); } return 0; }
--- c5.s1020.cteam056.fo.cpp.0.fo.cpp +++ c5.s1025.cteam056.fo.cpp.0.fo.cpp @@ -14,5 +14,5 @@ struct vertex { - float x, y; + double x, y; }; @@ -33,8 +33,8 @@ bool right(vertex& v1, vertex& v2, vertex& v3) { - float x1 = v2.x - v1.x; - float y1 = v2.y - v1.y; - float x2 = v3.x - v1.x; - float y2 = v3.y - v1.y; + double x1 = v2.x - v1.x; + double y1 = v2.y - v1.y; + double x2 = v3.x - v1.x; + double y2 = v3.y - v1.y; return (x1*y2 - x2*y1) < 0.0f; } @@ -89,8 +89,8 @@ void obdelnik() { - float minx, maxx, miny, maxy; - float minobsah = 100000000000.f; + double minx, maxx, miny, maxy; + double minobsah = 100000000000.f; - float sx, sy, nx, ny; + double sx, sy, nx, ny; for (int i = 0; i < (int)o.size()-1; i++) { @@ -102,10 +102,10 @@ sx = o[i+1].x - o[i].x; sy = o[i+1].y - o[i].y; - float invlen = 1.f / sqrt(sx * sx + sy * sy); + double invlen = 1.f / sqrt(sx * sx + sy * sy); sx *= invlen; sy *= invlen; nx = sy; ny = -sx; - float x, y; + double x, y; for (int j = 0; j < (int)o.size(); j++) { @@ -119,5 +119,5 @@ minobsah = std::min(minobsah, 2 * (maxx - minx) + 2 * (maxy - miny)); } - printf("%f\n", minobsah); + printf("%lf\n", minobsah); } @@ -132,5 +132,5 @@ { vertex vnew; - scanf("%f%f", &vnew.x, &vnew.y); + scanf("%lf%lf", &vnew.x, &vnew.y); v.push_back(vnew); } @@ -141,5 +141,5 @@ for (i = 0; i < vcount; i++) { - printf("%f %f\n",v[i].x, v[i].y); + printf("%lf %lf\n",v[i].x, v[i].y); } printf("--\n");