2011 Regular Polygon

题目链接

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
#define pi acos(-1.0)
#define N 100 + 10
#define eps 1e-6

int n;
double a[N];

int cmp(double x)
{
    if(fabs(x) < eps) return 0;
    return x > 0 ? 1 : -1;
}

int check(double x)
{
    double sum = 0;

    for(int i = 0; i < n; i++)
    {
        if(cmp(a[i] + a[i + 1] - x) <= 0) return 1;
        if(cmp(a[i] + x - a[i + 1]) <= 0 || cmp(a[i + 1] + x - a[i]) <= 0) return -1;
         sum += acos((a[i] * a[i] + a[i + 1] * a[i + 1] - x * x) / (2 * a[i] * a[i + 1]));
    }
    int tmp = cmp(sum - 2 * pi);
    if(tmp == 0) return 0;
    return tmp > 0 ? 1 : -1;
}

int main()
{
    int kase = 0, _T;
    scanf("%d", &_T);
    while(_T--)
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
        scanf("%lf", &a[i]);
        a[n] = a[0];
        double l = 0.0, r = 20000;
        int flag = 0; double ans;
//        for(int i = 0; i < 100; i++)
//        {
//            double mid = (l + r) / 2;
//            int t = check(mid);
//            if(t == 0)
//            {
//                flag = 1;
//                ans = mid;
//                break;
//            }
//            if(t > 0) r = mid;
//            else l = mid;
//        }

        while(cmp(r - l) > 0)
        {
            double mid = (l + r) / 2;
            int t = check(mid);
            if(t == 0)
            {
                flag = 1;
                ans = mid;
                break;
            }
            if(t > 0) r = mid;
            else l = mid;
        }


        printf("Case %d: ", ++kase);
        if(!flag) printf("impossible\n");
        else printf("%.3f\n", ans);
    }
    return 0;
}

/*

2
3
3.0 4.0 5.0
3
1.0 2.0 3.0

*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是实现该函数的代码: ``` regular_polygon <- function(n, x = 0, y = 0, col = "black", border = "black") { angles <- seq(0, 2*pi, length.out = n+1)[-1] x_coords <- x + cos(angles) y_coords <- y + sin(angles) polygon(x_coords, y_coords, col = col, border = border) } ``` 这个函数接受五个参数:n表示正多边形的边数,x和y表示多边形中心的坐标,col表示多边形内部的颜色,border表示多边形边框的颜色。默认情况下,多边形中心在原点(x=0, y=0),内部和边框的颜色都是黑色。 函数的实现比较简单,首先根据正多边形的边数计算出各个顶点的坐标,然后调用R语言自带的polygon函数绘制多边形。 ### 回答2: 下面是用R语言编写的函数 `regular_polygon(n, x, y, col, border)`,它可以绘制出一个正n边形。该多边形的中心默认为原点,可以通过参数col和border设置多边形的内部颜色和边框颜色,函数内部调用了`polygon`函数来绘制多边形。 ```R regular_polygon <- function(n, x, y, col, border) { angles <- seq(0, 2 * pi, length.out = n + 1)[-1] coordinates <- cbind(x + cos(angles), y + sin(angles)) polygon(coordinates, col = col, border = border) } ``` 函数接受以下参数: - `n`: 一个数字,代表正n边形的边数。 - `x`和`y`: 用于确定多边形中心的坐标。 - `col`: 一个字符串,指定多边形内部的颜色。 - `border`: 一个字符串,指定多边形的边框颜色。 函数首先使用`seq`函数创建一个包含从0到2π的角度向量,并将其分成n个等分。然后使用`cos`和`sin`函数将这些角度转换为对应的多边形顶点的x和y坐标。最后,使用`polygon`函数绘制多边形,并根据参数设置内部颜色和边框颜色。 ### 回答3: 下面是一个使用R语言编写的函数,名为`regular_polygon`,它可以绘制一个正n边形,其中多边形中心默认在原点。函数利用`col`参数设置正多边形的填充颜色,`border`参数设置多边形的边框颜色,并利用`polygon`函数绘制多边形。 ```R regular_polygon <- function(n, x, y, col, border) { angle <- 2 * pi / n # 计算多边形的顶点坐标 vertices <- matrix(0, n, 2) for (i in 1:n) { vertices[i,1] <- x + cos(angle * i) vertices[i,2] <- y + sin(angle * i) } # 绘制多边形 polygon(vertices, col = col, border = border) } ``` 使用示例: ```R # 绘制一个5边形,中心在原点,填充颜色为红色,边框颜色为蓝色 regular_polygon(5, 0, 0, "red", "blue") # 绘制一个7边形,中心坐标为(1, 2),填充颜色为绿色,边框颜色为黄色 regular_polygon(7, 1, 2, "green", "yellow") ``` 通过调用`regular_polygon`函数并传入相应的参数,可以绘制出具有不同边数、中心坐标以及填充颜色和边框颜色的正多边形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值