信息学竞赛题解(IO题解)

开场舞蹈 #普及组#

2019-10-05  本文已影响0人  腐啊

题目

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);
}
上一篇下一篇

猜你喜欢

热点阅读