题目
Problem Description
在全世界人民的期盼下,2008年北京奥林匹克运动会终于隆重召开了!
为了展示中华民族博大精深的优秀传统文化,负责开幕式开场舞蹈的编排人员一丝不苟,每一个细节都力争完美。关于队伍是采用“天圆”阵还是“地方”阵的问题,大家讨论了七天七夜,仍没有结果。于是,他们希望借助计算机,计算两种阵型的成本。
队伍将排列在一个二维平面内,且必须以(0,0)点为中心使得队伍保持对称美。“天圆”阵是一个圆形,而“地方”阵则是一个边平行于坐标轴的正方形。由于某种因素,阵型要求覆盖某些点(可以在边上)。
你的任务是,计算出能够覆盖这些点的两种阵型的最小面积。
Input
第一行是一个整数n(1<=n<=100000),表示需要覆盖的点的个数。接下来n行,第i行是两个整数xi,yi(-1000<=xi,yi<=1000),表示第i个点的坐标位置(xi,yi)。
Output
第一行是一个整数s1,表示能够覆盖这些点的“天圆”阵的最小面积(pi=3.14,四舍五入)。第二行是一个整数s2,表示能够覆盖这些点的“地方”阵的最小面积。
Sample Input
4
0 0
0 2
5 0
8 0
Sample Output
201
256
思路
我靠,乍一看弄得我以为要搞图论,其实十分简单.
首先明确一下步骤
1.输入
2.循环求两个阵的面积
3.输出
好,具体实施请看下面↓
1.输入
输入代码不要我说,你们都懂吧~
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d%d", &x[i], &y[i]);
2.循环求两个阵的面积
其实也很easy啦
求方阵边长,就将每个给的坐标里,不管横纵,取最大值再*2.
再求面积.
注意,因为坐标正负与面积无关系,所以先自身取绝对值.
求圆阵也简单,利用勾股定理,求出半径.
for(int i = 1; i <= n; i++)
{
x[i] = abs(x[i]);
y[i] = abs(y[i]);//绝对值
/*-------------------------------*/
jzbc = max(x[i] * 2, max(y[i] * 2, jzbc));//判断最大的边长
jzmj = jzbc * jzbc;//求面积
/*-------------------------------*/
ybj = max(ybj, sqrt(x[i] * x[i] + y[i] * y[i]));//求最大半径
ymj = pi * ybj * ybj;//面积
}
好了,细节不在强调.
贴完整代码.
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int x[100001], y[100001];
const double pi = 3.14;
int jzbc, jzmj;
double ybj, ymj;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d%d", &x[i], &y[i]);
for(int i = 1; i <= n; i++)
{
x[i] = abs(x[i]);
y[i] = abs(y[i]);
/*-------------------------------*/
jzbc = max(x[i] * 2, max(y[i] * 2, jzbc));
jzmj = jzbc * jzbc;
/*-------------------------------*/
ybj = max(ybj, sqrt(x[i] * x[i] + y[i] * y[i]));
ymj = pi * ybj * ybj;
}
printf("%.0lf\n%d",ymj , jzmj);
}
网友评论