Cod sursa(job #560921)

Utilizator EvilOGLSzabolcs EvilOGL Data 18 martie 2011 19:10:49
Problema Rubarba Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#define _USE_MATH_DEFINES
#include <math.h>

float fi = (float)(M_PI / 180 / 2);

typedef float vect2f[2];
vect2f pos[100000];
int n;

vect2f r1, r2;

void load() {
	FILE * f1 = fopen("rubanda.in", "r");
	fscanf(f1, "%d", &n);
	for (int i = 0; i < n; ++i) {
		fscanf(f1, "%f%f", &pos[i][0], &pos[i][1]);
	}
	fclose(f1);
}

void rotate() {
	float a, d;
	for (int i = 0; i < n; ++i) {
		a = atan2(pos[i][1], pos[i][0]) + fi;
		d = sqrt(pos[i][1] * pos[i][1] + pos[i][0] * pos[i][0]);
		pos[i][1] = sin(a) * d;
		pos[i][0] = cos(a) * d;
	}
}

float select() {
	r1[0] = pos[0][0];
	r1[1] = pos[0][1];
	r2[0] = pos[0][0];
	r2[1] = pos[0][1];
	for (int i = 1; i < n; ++i) {
		if (r1[0] > pos[i][0]) {r1[0] = pos[i][0];}
		if (r1[1] > pos[i][1]) {r1[1] = pos[i][1];}
		if (r2[0] < pos[i][0]) {r2[0] = pos[i][0];}
		if (r2[1] < pos[i][1]) {r2[1] = pos[i][1];}
	}
	return((r2[0] - r1[0]) * (r2[1] - r1[1]));
}

int main() {
	load();
	float s, min = select();
	for (int i = 0; i < 180; ++i) {
		rotate();
		s = select();
		if (min > s) {
			min = s;
		}
	}
	FILE * f1 = fopen("rubanda.out", "w");
	fprintf(f1, "%.3f\n", min);
	fclose(f1);
}