『8.20 模拟赛』旋转的多边形

题目链接戳着里!!

题目描述

解题思路

显然,多边形滚动的时候,指定的点一定是绕着某一个顶点旋转的,旋转的半径就是点到顶点的距离,角度就是顶点所在脚的外角。

如下图所示:

那么我们的问题就转化成了求dis和θ了。

dis很简单,只要勾股定理就好了。

那θ呢?也很简单喽,只要链接当前顶点的相邻的两个顶点,运用余弦定理求就好啦,注意一下角度值和弧度制就可以了。

(不会余弦定理的小伙伴戳这里==>  Wikipedia & 百度百科

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const double PI=acos(-1.0);
 8 struct nod{
 9     int x,y;
10     double dis,deg;
11 };
12 int n,xq,yq;
13 nod p[100];
14 double ans;
15 inline double gougu(int x1,int y1,int x2,int y2){
16     return (double)sqrt((double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
17 }
18 inline double yuxian(double dis1,double dis2,double dis3){
19     double cosc=(dis2*dis2+dis3*dis3-dis1*dis1)/(2*dis2*dis3);
20     cosc=acos(cosc);
21     cosc=cosc*180.0/PI;
22     return cosc;
23 }
24 inline void calc_dis(){
25     for(register int i=1;i<=n;i++){
26         p[i].dis=gougu(xq,yq,p[i].x,p[i].y);
27     }
28 }
29 inline void calc_deg(){
30     for(register int i=1;i<=n;i++){
31         int la=i-1,ne=i+1;
32         if(la==0)la=n;
33         if(ne==n+1)ne=1;
34         double dis1=gougu(p[la].x,p[la].y,p[ne].x,p[ne].y);
35         double dis2=gougu(p[la].x,p[la].y,p[i].x,p[i].y);
36         double dis3=gougu(p[i].x,p[i].y,p[ne].x,p[ne].y);
37         p[i].deg=yuxian(dis1,dis2,dis3);
38     }
39 }
40 inline void calc(){
41     for(register int i=1;i<=n;i++){
42         ans+=2.0*PI*p[i].dis*((180.0-p[i].deg)/360.0);
43     }
44 }
45 int main(){
46     scanf("%d",&n);
47     for(register int i=1;i<=n;i++){
48         scanf("%d%d",&p[i].x,&p[i].y);
49     }
50     scanf("%d%d",&xq,&yq);
51     calc_dis();
52     calc_deg();
53     calc();
54     printf("%.3f\n",ans);
55 }

原文地址:https://www.cnblogs.com/Fang-Hao/p/9507681.html

时间: 2024-07-29 22:19:20

『8.20 模拟赛』旋转的多边形的相关文章

『8.20 模拟赛』冒泡排序

题目描述 给定n,k,和一个长度为n的序列,请输出这个序列冒泡排序k次之后的结果. 解题思路 我们观察上面给出的伪代码,可以发现这是一段把代码排序成升序的代码,那我们来考虑一下冒牌排序的几个特征. 一个大的数要向右交换,但是一次交换之后就可以换很多位置,所以换一次就不知道跑到哪里去了,所以很难维护. 一个小的数每次最多和它左边的更大的数交换一次,所以一次最多向左边跑一个位置,比大数不知道好维护到那里去了. 进一步思考,k次交换之后,最多可以向左跑k步,也就是说k+1位置的数最远能跑到1的位置上来

『8.21 模拟赛』Victory

题目描述 迟到大王rsw喜欢V这个字母,因为V代表着victory,当一个数字,从左向右数的时候,没有出现过先递减,再递增的情况,就被称作Victory数. 也就是说,这个数字可以是递增的,也可以是递减的,也可以是先递减再递增的,这个过程中可以出现相邻数字相等的情况,但是,就是不能出现过先递减再递增的情况. 问题是:给定n,问:1~n之间有多少个victory数. 解题思路 我们应该一眼就能看出这是一道数位dp题,一开始用3维dp写,状态不够写挂了...后来改用4维就A了. 我们用dp[ i ]

『8.21 模拟赛』技能大赛

题目描述 rsw因为迟到次数太多被列入黑名单,于是被派去参加陕西妇女儿童技能大赛,大赛中共安排了m个比赛项目,算上rsw在内,共有n位选手报名参加本次比赛.(如rsw,zrx,kh,ljm,cky,大耳朵图图,大头儿子等) 经过m场比赛,组委会发现,每个项目,有且仅有两个人实力超群.(比如穿针引线项目,rsw,ljm独领风骚,健美操项目,cky,cjy风姿绰约). 现在,组委会要推选一些人去参加全国比赛,因为每个项目都必须有人擅长,所以推选的这些人,对于每一个项目,至少要有一个人擅长. 已知,选

『8.21 模拟赛』冒泡排序 II

题目描述 前一天的冒泡排序对rsw来说太简单了,所以又有了冒泡排序2,给定n,k,q,问:有多少个不同的1~n的排列,能够使得,冒泡排序k趟后,得到一个几乎正确的序列. 一个几乎正确的序列指的是:它的最长上升子序列的长度至少是n-1. 解题思路 思路就是没有思路.... 昨天刚刚做过一道冒泡排序的题,有一个结论在这里 每个位置上的数最远是由前面的第k个位置转移过来的,并且题目中要求最长上升子序列最短是n-1的长度,所以只有两种情况: 1) 最终是从小到大排序好的 2)最终是从小到大排序好的序列中

『8.24 模拟赛』ranwen的服务器

题目链接戳这里n(*≧▽≦*)n 题目描述 众所周知,ranwen建造出了强大的服务器网,规模十分庞大,有n个服务器,组成一个树形结构,1号点是总站,但是有时候可能会因为主机被回收,机房断电等事故造成服务器各种GG,现在有m个事件,可能为:1.查询x到根路径上第一个已经挂掉的服务器传输路径 2.x到y路径上的服务器传输路径全挂了.(不存在则输出0) 解题思路 上来先是树剖,然而只过了样例,爆0... 题面上提示了正解是并查集,但是并没有想出来,听完题解瞬间懂了.... 并查集,当然最方便的是合并

『8.25 模拟赛』外卖 (atcoder 100e)

题目链接 题目描述 众所周知,\(cky\)喜欢点外卖. 已知可选的商品有\(n\)种,\(cky\)由于胃容量问题只能点两份(不能一种点两份).\(cky\)要在防止营养过剩的情况下选择美味度最高的搭配. 具体的,对于每第\(i\)个商品,\(i\)正好是其营养成分,\(s_i\)表示其美味度(商品从\(0\)开始编号). 对于每种搭配\((a,b)\),其营养程度为(\(a|b\)其中\(|\)表示二进制下的按位或),其美味度为\(s_a+s_b\). 即\(cky\)要选择满足\(a|b\

18.9.20模拟赛T2 城市 枚举

题目大意:给出$N$个数两两的和共$\frac{N \times (N-1)}{2}$个数,请你求出原来的$N$个数输入:第一行一个数$N$,第二行$\frac{N \times (N-1)}{2}$个数表示两两之和(不保证有序)输出:第一行为可行解个数$K$,接下来$K$行每行一个方案,每一个方案的数字从小到大输出,中间有一个空格:方案按字典序从大到小输出.sample input:4 3 6 5 4 5 7 sample output:11 2 3 4数据范围:$2 \leq N \leq

【题解】2019,4.20模拟赛 (白鼠)

\(Description:\) 给出一块巧克力,横着可以切 \(h\) 刀,竖着可以切 \(w\) 刀,横着切了 \(i\) ,竖着切了 \(j\) 可以得到 \((i+1)*(j+1)\) 块巧克力,每次切得代价是巧克力块数,求切 \(k\) 的期望代价,每次在剩余能切的位置等概率选一个切,答案对 \(10^9+7\) 取模. \(Sample\) \(Input:\) 2 1 2 \(Sample\) \(Output:\) 666666677 $Solution: $ 一开始考试的时候没

2019.7.20模拟赛

T1 串 签到题.看完样例就很容易猜到这题答案多半就是\(\{-1,1,2\}\)里面的,然后感性理解理性证明了一通,发现好像的确是这样. 如果串形如\(aaaaaaa,aaaabaaaa,abababababa\),那么直接无解. 如果串不是回文串,就是1. 剩下的全都是2. T2 变量 不算难的最小割,不过我网络流实在太差,只有在省选前补了一下,所以并没有做出来. 首先把\(w_i,|w_i-w_j|\)的系数全都整理出来.既然每个点只能有两种选择,所以考虑最小割,设连\(S\)表示选正权值