Problem D: Bounding box

Problem D: Bounding box

时间: 1ms        内存:128M

描述:

Problem D: Bounding box

The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located at vertices of regular polygons. The moving sand dunes of the desert render the excavations difficult and thus once three vertices of a polygon are discovered there is a need to cover the entire polygon with protective fabric.

Input contains multiple cases. Each case describes one polygon. It starts with an integer n <= 50, the number of vertices in the polygon, followed by three pairs of real numbers giving the x and y coordinates of three vertices of the polygon. The numbers are separated by whitespace. The input ends with a n equal 0, this case should not be processed.

For each line of input, output one line in the format shown below, giving the smallest area of a rectangle which can cover all the vertices of the polygon and whose sides are parallel to the x and y axes.

输入:

输出:

示例输入:

4
10.00000 0.00000
0.00000 -10.00000
-10.00000 0.00000
6
22.23086 0.42320
-4.87328 11.92822
1.76914 27.57680
23
156.71567 -13.63236
139.03195 -22.04236
137.96925 -11.70517
0

示例输出:

Polygon 1: 400.000
Polygon 2: 1056.172
Polygon 3: 397.673

提示:

参考答案(内存最优[748]):

#include <stdio.h>
#include <assert.h>

int main () {
  unsigned int W, l ,h, n;
  while (scanf("%u",&n)==1) {
    assert(1 < n && n < 4294967295U);
    W = 1; 
    l = n/9; if (l*9<n) l++; h = n-1;
    while (1) {
      if (l <= 1 && 1 <= h) {
	printf(W?"Stan wins.\n":"Ollie wins.\n");
	break;
      }
      if (W) {
	if (l/2*2 < l) l = l/2+1; else l/=2;
	h/=9;
	W=0;
      } else {
	if (l/9*9 < l) l = l/9+1; else l/=9;
	h/=2;
	W=1;
      }
    }
    
  }
  return 0;
}

参考答案(时间最优[0]):

#include <stdio.h>
#include <assert.h>

int main () {
  unsigned int W, l ,h, n;
  while (scanf("%u",&n)==1) {
    assert(1 < n && n < 4294967295U);
    W = 1; 
    l = n/9; if (l*9<n) l++; h = n-1;
    while (1) {
      if (l <= 1 && 1 <= h) {
	printf(W?"Stan wins.\n":"Ollie wins.\n");
	break;
      }
      if (W) {
	if (l/2*2 < l) l = l/2+1; else l/=2;
	h/=9;
	W=0;
      } else {
	if (l/9*9 < l) l = l/9+1; else l/=9;
	h/=2;
	W=1;
      }
    }
    
  }
  return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注