「Luogu P3680 凸轮廓线」
一道神奇的计算几何题
前置芝士
推导公式
对于一串是圆和正方形开头和结尾时是十分好做的,这里也不展开了.
那么问题来了,三角形开头时需要怎么算呢???
如果全部都是三角形那也可以直接算,一串三角形后面是一个正方形:

可以将这条红色线段树放入一个三角形中,其中一条边为黄色线段树,这个还是十分好计算的\(l=n-0.5\)(n为三角形个数),还有一条边为正方形边长减去绿色线段(正三角形的高),\(l=1-\sqrt{3}*0.5\),这样,这道题的差不多一半的分就被拿到了.

对于这样一条线段,如果又用刚才的方法那真是太天真了,这样会导致计算上出现一点小小的偏差,但是绝对能把您卡掉,红色线段与圆是相切的,所以:

可以通过这样算出红色线段的长,但是,在红色线段上那小小的圆弧要怎么办呢

(高倍放大镜下的图),将这个角分成几个角,用三角函数求出弧度,再求出弧长就好了(因为作者懒,具体不解释).
具体做法
实在是看见三角函数就头痛,所以pass了.
代码
#include<bits/stdc++.h>
#define rap(i,first,last) for(int i=first;i<=last;++i)
#define pi 3.1415926535
using namespace std;
int N;
double answer,sum,Long;
char s[100];
double Helf(char ch)
{
if(ch=='S')return 2.0;
if(ch=='C')return pi/2;
if(ch=='T')return 1.5;
}
double Delta(double a,double b)
{
double CosA,Angle,c;
c=sqrt(a*a+b*b);
CosA=b/c;
Angle=acos(CosA)/pi*180;
return Angle;
}
double Delta_2(double a,double b)
{
double CosA,Angle,c;
c=sqrt(b*b-a*a);
CosA=(2*b*b-2*a*a)/(2*b*c);
Angle=acos(CosA)/pi*180;
return Angle;
}
int main()
{
scanf("%d",&N);
rap(i,1,N)cin>>s[i];
answer=N*2-2;
int l=1,r=N;
while(s[l]=='T'&&l<N)l++;
while(s[r]=='T'&&r>1)r--;
if(l>r)//特判全是三角形
{
answer=N*2+1;
printf("%.9ld",answer);
return 0;
}
if(l==1)
answer+=Helf(s[1]);//第一个位置不是三角形
else
{
Long=l-1;
if(s[l]=='C')
{
sum=Delta(sqrt(3)*0.5-0.5,Long)+Delta_2(
sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+Long*Long-0.25),
sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+Long*Long));//算出圆弧的角度,如果看不懂可以先学习三角函数
answer+=1+sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+Long*Long-0.25)-(Long-0.5)+(90-sum)/360*pi;//算出圆弧加线段的长
}
else
answer+=+1+sqrt((1-0.5*sqrt(3))*(1-0.5*sqrt(3))+(Long-0.5)*(Long-0.5))-(Long-1);//正方形的计算还是比较简单的
}
if(r==N)//以下同理
answer+=Helf(s[N]);
else
{
Long=N-r;
if(s[r]=='C')
{
sum=Delta(sqrt(3)*0.5-0.5,Long)+Delta_2(
sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+Long*Long-0.25),
sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+Long*Long));
answer+=1+sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+Long*Long-0.25)-(Long-0.5)+(90-sum)/360*pi;
}
else
answer+=+1+sqrt((1-0.5*sqrt(3))*(1-0.5*sqrt(3))+(Long-0.5)*(Long-0.5))-(Long-1);
}
printf("%.9ld",answer);
}
「Luogu P3680 凸轮廓线」的更多相关文章
- 「Luogu P2568 GCD」
看到这是一道紫题还是和gcd有关的才点进来(毕竟数论只会gcd). 前置芝士 质数**(又称素数):因数只有1和本身,但是很特殊的1不是一个质数. gcd**:欧几里得算法,又称辗转相除法,可以在约为 ...
- Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)
Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...
- Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)
Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...
- Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)
Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...
- Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)
Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...
- Note -「Dijkstra 求解 MCMF」
食用前请先了解 SPFA + Dinic/EK 求解 MCMF. Sol. 总所周知,SPFA 牺牲了.于是我们寻求一些更稳定的算法求解 MCMF. 网络流算法的时间属于玄学,暂且判定为混乱中的稳定. ...
- 对于前端,「微信小程序」其实不美好
微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...
随机推荐
- CentOS6.5_x64卸载系统原有MySQL
1.查看系统是否存在MySQL的版本 rpm -qa | grep mysql 2.删除老版本的开头文件和库(rpm -e --nodeps XXX) rpm -e --nodeps mysql-5. ...
- 如何让后加载的元素被一开始就有的css样式渲染成功(强制提升css优先级)
今天在做搜索框中的提示语下拉的时候,提示框把搜索框的底部的border遮住,导致看起来不是很美观: 因为下方的提示框是用js后加载的它的样式也是随着js一起加载的,而这个js和它的css我们是不能改动 ...
- NIO的理解
一.缓冲区(Buffer):在java NIO中负责数据的存取,实际上就是数组,用于存储不用数据类型的数据,根据数据类型不同(boolean除外),提供了相应类型的缓冲区(ByteBuffer,Cha ...
- Python实现重命名一个文件夹下的图片
在网上查了一下python实现的图片重命名,工作中刚好用一下. # -*- coding:utf8 -*- import os path = '新建文件夹 (2)/' filelist = os.li ...
- iOS 开发之基于JWT的Token认证机制及解析
在移动端和服务端通信中,一般有两种认证方式:token 和 session. 1.session/cookie 认证机制: 在服务端创建一个Session对象,同时在客户端的浏览器端创建一个Cooki ...
- 《一篇文章读懂HTTPS及其背后的加密原理》阅读笔记
HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.这篇文章深入介绍了它的原理. 当我们适用 ...
- php 单机redis 常用命令
一.Redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connect('127.0.0.1', 6379, 3 ...
- Linux - Shebang(#!)
1. Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指明了执行这个脚本文件的解释程序.
- 「题解」Just A String
目录 题目 原题目 简易题意 思路及分析 代码 题目 原题目 点这里 简易题意 现定义一个合法的字符串满足将其打散并任意组合之后能够形成回文串. 给你 \(m\) 种字母,问随机构成长度为 \(n\) ...
- Jedis实现频道的订阅,取消订阅
第一步:创建一个发布者 package work; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; i ...