HDU 5531 Rebuild 相切的圆们

解决 TensorFlow 和 Keras 的 Python 版本兼容问题:详细技术指南 本文提供了TensorFlow和Keras与Python版本不兼容问题的完整解决方案。通过版本对照表指出不同TensorFlow版本对应的Python支持范围,强调2.13.x仅支持Python 3.9-3.11,且不兼容Python 3.12+。给出最佳实践建议:使用虚拟环境管理项目依赖,推荐venv或conda创建独立环境;指导正确安装TensorFlow和Keras版本,建议优先使用tf.keras避免冲突;针对常见报错如DLL加载失败、模块导入错误等提供具体解决方法。最后给出一个在兼容环境中运行的M 阅读详情

终于迎来了长春的重现。赛场上太多的遗憾,比赛的时候唯一看都没看一眼的题就是这个题,太可惜了。连同B题一起,为了抢个FB对不住打重现赛的童鞋们了。。。。。求放过,也不知道这个时候写题解算不算违规呢哈哈。。。。。。





题意:按顺序给出一个多边形,以多边形的每个顶点为圆心作圆,使得任意两相邻点对应的圆相切,求所有圆面积总和的最小值。




画个图算两下就出来了,发现只需要对n的奇偶性进行讨论即可。

设每个点为pi(0 <= i <= n - 1),对应圆的半径为ri,pi和p(i + 1)(默认pn为p0)的距离为di,则很显然我们得到了n个方程:

Fi:ri + r(i + 1) = di(0 <= i <= n - 1)。

通过这个方程我们发现,全部加起来除以2即得到了所有ri的和。当n为奇数时,将i为奇数的方程Fi相加可以得到r1 + r2 + ...... + r(n - 1)的和,再用总和减去它即得到了r0,也就是说,n为奇数时,这个方程组有唯一解,所以,解出所有的解,只要所有解都非负即可算出答案,如果有负的就IMPOSSIBLE。当n为偶数时,i为偶数的方程相加和i为奇数的方程相加的结果应该是一样的(都等于所有ri之和)。所以先算这两个和,如果这两个和不相等,也是IMPOSSIBLE。其次,我们从第二个方程起,可以将每个ri都变成与r0相关的式子,这样,所有圆的面积都可以用r0表示,最后的总面积是关于r0的二次函数,直接求解最小值即可。设ri = ai*r0 + bi,

则r(i + 1) = di - ri = -ai*r0 - bi + di。所以a(i + 1) = -ai,b(i + 1) = - bi + di。a0 = 1,b0 = 0。这样求出每个ai和bi(可以发现ai只有1和-1),然后面积和 = pi*sigma(ri^2,0 <= i <= n - 1) = A*r0^2 + B*r0 + C,算出A,B,C的值再根据每个ri的范围(0 <= ri <= min(di,d(i + 1))求出r0的取值范围(即维护区间的左右端点),如果区间右端点小于左端点,则无解IMPOSSIBLE。否则根据二次函数性质算出区间内最低点即可。






#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <set>
using namespace std;

const int MAX = 1e4 + 5;
const double pi = acos(-1.0);
const double eps = 1e-6;

int n, x[MAX], y[MAX];
double d[MAX], r[MAX];

int sgn(double t)
{
    return (t > eps) - (t < -eps);
}

double f(double a, double b, double c, double t)
{
    return a*t*t + b*t + c;
}

void input()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d%d", &x[i], &y[i]);
}

void solve()
{
    x[n] = x[0];
    y[n] = y[0];
    for(int i = 0; i < n; i++)
        d[i] = sqrt((x[i + 1] - x[i])*(x[i + 1] - x[i]) + (y[i + 1] - y[i])*(y[i + 1] - y[i]));
    if(n&1)
    {
        double all = 0, other = 0, ans = 0;
        for(int i = 0; i < n; i++)
        {
            all += d[i];
            if(i&1)
                other += d[i];
        }
        r[0] = all/2 - other;
        if(sgn(r[0]) < 0)
        {
            printf("IMPOSSIBLE\n");
            return;
        }
        ans += r[0]*r[0];
        for(int i = 1; i < n; i++)
        {
            r[i] = d[i - 1] - r[i - 1];
            if(sgn(r[i]) < 0)
            {
                printf("IMPOSSIBLE\n");
                return;
            }
            ans += r[i]*r[i];
        }
        printf("%.2lf\n", pi*ans);
        for(int i = 0; i < n; i++)
            printf("%.2lf\n", r[i]);
    }
    else
    {
        double temp = 0;
        for(int i = 0; i < n; i += 2)
            temp += d[i] - d[i + 1];
        if(sgn(temp) != 0)
        {
            printf("IMPOSSIBLE\n");
            return;
        }
        int k = 1;
        double b = 0, L = 0, R = d[0];
        double A = 1, B = 0, C = 0;
        for(int i = 1; i < n; i++)
        {
            k = -k;
            b = -b + d[i - 1];
            if(k == 1)
                L = max(L, -b);
            else
                R = min(R, b);
            A++;
            B += 2*k*b;
            C += b*b;
        }
        if(sgn(L - R) > 0)
        {
            printf("IMPOSSIBLE\n");
            return;
        }
        double mid = -B/(2*A), ans;
        if(sgn(L - mid) >= 0)
        {
            ans = f(A, B, C, L);
            r[0] = L;
        }
        if(sgn(R - mid) <= 0)
        {
            ans = f(A, B, C, R);
            r[0] = R;
        }
        if(sgn(mid - L) >= 0 && sgn(mid - R) <= 0)
        {
            ans = f(A, B, C, mid);
            r[0] = mid;
        }
        printf("%.2lf\n", pi*ans);
        for(int i = 0; i < n; i++)
        {
            if(i)
                r[i] = d[i - 1] - r[i - 1];
            printf("%.2lf\n", r[i]);
        }
    }
}

int main()
{
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; t++)
    {
        input();
        solve();
    }
}


数美device_fingerprint、device_id、hmac生成 device_fingerprint、hmac、device_id参数分析与解读 阅读详情

相关推荐

3线SWD接线终极指南:用Jlink调试非3.3V设备的5个关键细节

本文详细解析了使用Jlink调试非3.3V设备时,3线SWD接线的5个关键细节。核心在于正确理解并连接Vref引脚以实现电压适配,避免供电冲突,并掌握精简接线法与固件修复技巧。文章以STM32F205等芯片为例,指导开发者安全、高效地进行混合电压调试。

e4f5g6h7的博客 437

HDU - 5531(Rebuild )分析+三分

题意: 给定一个n,代表有n个点,给出n个坐标,以每个坐标为圆心画圆。 要求:①相邻的两个点画的圆必须相切(第i个和第i+1个,及第一个点和最后一个点)            ②所有圆的面积之和最小。 注:半径可以为0。 分析: 如果n为奇数,通过列方程可以知道,,可以发现r1是确定的。(不懂可以用n=3举个栗子,把方程列出来就明白了) 那么就可以直接求r1,然后 r[i]=d...

Vici__ 384

从Peer到脉冲地震波:免费Python工具全流程配置教程(PyCharm+Anaconda)

本文详细介绍了如何使用Python工具链(PyCharm+Anaconda)实现从Peer数据库获取地震波数据到生成脉冲地震波的全流程配置。通过开源工具EQTOOL和PySeismicGen,结合Python环境搭建、数据格式转换和脉冲地震动生成技术,为结构抗震分析提供高效、灵活的解决方案。

weixin_29093169的博客 430

HDU5531(三分)

分析:这个题就是让我们给一个多边行每一个顶点为圆心画圆,然后相邻顶点的园是像相切的,使面积最小。 题解:这个题,如果是奇数多边形的话,可以推导出来,每个圆的半径是固定的。以三角形为例即可证明。如果顶点是偶数个,那个就三分一条边,因为可以以四边形证明,半径越趋于边长的一半,他的总面积就会最小,符合凸性#include #include #include #include #include usin

nucshiyilang的博客 344

[南大ICS]PA1 - 开天辟地的篇章: 最简单的计算机

task PA1.1: 实现单步执行, 打印寄存器状态, 扫描内存 task PA1.2: 实现算术表达式求值 task PA1.3: 实现所有要求, 提交完整的实验报告

qq_42474104的博客 1570

白话详细解读(七)----- CBAM:Convolutional Block Attention Module

一、CBAM简介 论文链接:https://x.sci-hub.org.cn/scholar?hl=zh-TW&as_sdt=0%2C5&q=CBAM%3A+Convolutional+Block+Attention+Module&btnG=&oq=CB CBAM这篇论文是在2018年提出的,自提出之后,已经被引用上千次,可见其影响力。CBAM是一种专门为了卷积神经网络而设计的注意力模块,传统的卷积存在只关注局部信息,而往往忽略全局信息的弊端,以3*3卷积为例,滤波器有9个

奋斗の博客 1万+

HDU 5531 (平面几何 三分)

题意是给你n个点,然后要求以每个点为圆心画一个圆,使得两两相邻的圆心的圆相切,不相邻的圆可以相交,如果可以作这样的圆那么输出圆面积和的最小值和,每个圆的半径,否则输出IMPOSSIBLE。 首先我们求出每一条邻边的长度,记为l1, l2, l3, ... ,ln, 假定第一个圆的半径为x,那么我们可以用x表示所有圆的半径,分别为x, l1-x, l2-l1+x, l3-l2+l1-x ....

morejarphone~ 847

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

hdu5531 Rebuild

Rebuild Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 689    Accepted Submission(s): 151 Problem Description Archaeologists fin

LJQ 868

【读代码】从claude skills到superpowers项目

最近claude skills成了大热门,今天一起看下GitHub 上的开源技能框架,他将“工作流”封装为“技能” (Skills)。本文尝试剖析该项目的技能粒度定义、多技能关联架构、应用逻辑等。与传统的 Function Calling 不同,Superpowers 中的 Skill 定义粒度并非“原子操作”,而是**“认知模式” (Cognitive Mode) 或“工作阶段”**。

kakaZhui的博客 1918

TIBCO Jaspersoft Studio报表开发 使用教程-进阶版

本文学习内容容器定制二级目录三级目录 容器定制 二级目录 三级目录

吉哲的博客 7521

HDU 5531 (ACM 2015 长春) Rebuild [计算几何]

按次序给出N个属于一个凸多边形的点,问你能否在每个点上画一个圆,让相邻点上的圆两两相切(注意相邻!),若可以,输出所有圆的最小面积以及每个圆的半径。

Asuna_acmer 1281

DeerFlow 系列教程 第十六篇 | 实战案例一——用 DeerFlow 进行深度研究

在日常使用 AI Agent 时,最常见的需求之一就是对某个主题进行全面、系统的研究。多源信息采集——不能只依赖单次搜索,需要从多个角度搜索不同来源交叉验证——不同来源的信息需要相互印证,避免单一信源的偏差结构化输出——最终产出的不是零散的信息片段,而是有组织的研究报告传统做法是人工反复搜索、阅读、整理。传统手工研究: DeerFlow 深度研究:人工搜索 → 阅读页面 → 记笔记 提交研究主题│ │▼ ▼换关键词 → 再搜索 → 再阅读 ┌──────────────────┐。

weixin_43674738的博客 161

HDU 5531 Rebuild (三分) ★ ★

题目大意:给定一个凸N边形N个顶点坐标(N>=3),在N边形每个顶点上构造一个圆要求相邻两顶点的圆相切,求能构造出的最小总圆面积 数据范围: 3 题目解答:三分法求下凸函数(复杂度O(N*log3(N))) 假设第一个点构造的圆半径为r,则其他点构造出的圆的半径可以依次表示出来,最后的答案是关于r的一个二次函数。 对于N边形分奇偶讨论: N为奇数:此时关于r的二次函数没

Ezereal的博客 504

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

HDU 5531 Rebuild ——— 2015ACM-ICPC亚洲区长春站

原题见HDU 5531依次输入n个点的坐标,分别为圆心。保证相邻圆心的距离是个正整数。第n个圆和第1个圆相邻。要求相邻两个圆要相切,求全部圆面积和的最小值,以及此时半径的取法。 先根据坐标求出相邻圆心距离依次为a0,a1,...,an−1a_{0},a_{1},...,a_{n-1} 设圆半径分别为x0,x1,...,xn−1x_{0},x_{1},...,x_{n-1} 化为方程,即:⎧⎩⎨

Ugly Gardon 2289

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

hdu 5531 Rebuild(三分)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5531 题目大意: 给出n个点,这n个点可以连成一个凸多边形。现在以多边形的端点作为圆心,分别做n个圆,要求在同一条线上的端点的圆是相切的。现在要求满足条件以后,计算最小的圆面积总和。如果不能保证条件成立,则输出impossible。 思路: 如果我们知道了第一个点上的圆的半径r,那么如

hahahaha 1467

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

hdu5531Rebuild+三分

Problem Description Archaeologists find ruins of Ancient ACM Civilization, and they want to rebuild it.The ruins form a closed path on an x-y plane, which has n endpoints. The endpoints locate on (x1,

xtulollipop 692

HDU5531 Rebuild 【几何+数学】

Rebuild Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 2008    Accepted Submission(s): 431 Problem Description Archaeologists fi

LuRiCheng的博客 932

hdu 5531 Rebuild 三分

题目大意:给你一个多边形,每个多边形的顶点都有一个圆,问是否存在一种情况,使得所有相邻的圆相切,切面积和最小。比赛的时想到了三分,但是并没有发现其中的奥义,所以并不能AC!!思路:首先我们可以发现,因为相邻两个圆是紧贴着的,所以只要一个圆的大小改变了,其余所有圆都要改变。因为圆的面积是个二次函数,这样的话我们只需通过三分某一个边的长度来求解。我们设dist[i]代表第i个点和第i+1个点的距离。P0

s_h_r 582

HDU - 5531- E - Rebuild(几何)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=5531 题意: 顺序给出二维坐标系中的点,让你找出以每个点为圆心的圆,使得相邻的点对应的圆相切,问圆的最小面积之和是多少. 思路: 这题其实比赛时就看出来了点端倪,看了题解加深了认识. 这题有以下特点: 1.确定第一个点的半径,则其余的半径都能确定. 2.第一个点半径改变,偶数点的变化与其...

刘二狗的博客 322

2015 ACM/ICPC Asia Regional Changchun && HDU - 5531 Rebuild【数学 + 三分】

题意: 给出一系列点,这些点依次相连,最后一个点和第一个点相连,形成一个多边形。问以每个点为圆心画一个圆(半径可为0),是否存在当前的圆与相邻的两个圆都相外切,如果有,则找到使总面积最小的方案,如果没有则输出“IMPOSSIBLE”。 题解 : 我们设圆的半径为r[1] 到 r[n], 设多边形的边长为d[1] 到 d[n]。于是就有 r[1] + r[2] = d[1] , r[2] + r[3] = d[2] , r[3] + r[4] = d[3], r[n-1] + r[n] = d[n-1], r

Tryna 184

2015ACM/ICPC亚洲区长春站 E hdu 5531 Rebuild

Rebuild Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 446Accepted Submission(s): 113 Problem Description Archaeologists find rui...

anmob303090的博客 188

HDU 5531 Rebuild(三分)——2015ACM/ICPC亚洲区长春站

传送门 RebuildTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 2483    Accepted Submission(s): 548Problem Description Archaeologists find ruins of

代码改变世界 1350

HDU 5531(Rebuild- 三分)

题意:已知a1+a2,a2+a3,...,an+a1a_1+a_2,a_2+a_3,...,a_n+a_1,求min(a21+a22+...+a2n)min(a_1^2+a_2^2+...+a_n^2) 只要知道a_1,就能求出整个序列(头尾需要特判,注意奇偶不一样) 容易写出ak=kiai+cia_k=k_ia_i+c_i的形式,保证每个数都非负就行 然后三分#include<cstdio>

nike0good |Oier&ACMer | 熟能生巧 626

HDU 5531 Rebuild 题解

HDU 5531题解

DarkoDu的博客 504

HDU 5531

题目大意: 给定一个n边形的顶点 以每个顶点为圆心画圆(半径可为0) 每个顶点的圆要和它相邻顶点的圆相切(不相邻的可相交) 求所有圆的最小面积总和并给出所有圆的半径 设半径为r1 r2 ... rn,顶点距离为L1 L2 ... Ln 当顶点数为奇数时 由 r1+r2=L1 r2+r3=L2 ...... rn+r1=Ln 可得 r1+r1=L1-L2+L...

babimei370256276的博客 276
上一篇: HDU 5528 Count a × b 纪念长春站的遗憾
FirstLucker
博客等级 码龄11年 8粉丝 49原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值