Codeforces 306D - Polygon(随机化+乱搞)
中考终于结束了……简单写道题恢复下状态罢。
首先这一类题目肯定没法用一般的方法解决,因此考虑用一些奇淫的乱搞做法解决这道题,不难发现,如果我们固定住了前 \(n-1\) 条边,那么第 \(n\) 条边的长度与前 \(n-1\) 条边的长度冲突的概率是小之又小了——这个用爪子想想即可明白。
因此考虑一个乱搞做法,我们每次随机前 \(n-1\) 条边的长度 \(l_1,l_2,\cdots,l_{n-1}\),然后从原点开始绕一圈每次旋转 \(\dfrac{2\pi}{n}\) 补全这个 \(n\) 边形,如果最后一条边的长度与前 \(n-1\) 条边长度均不同且在 \((0,1000]\) 之内则直接输出。
这样一来倒是避免边长度相同的问题了,但同时还会带来另一个问题,就是如果有可能我们随机出来的图形不是凸图形,比如说下图:

解决方法倒也容易,把每条边随机的范围变小一点即可,我是将第 \(i\) 条边的长度设为 \(600+0.1i\) 然后 random_shuffle,这样就不太可能出现这样的情况了。
思路出来了,剩下就是实现的问题了,旋转 \(\dfrac{2\pi}{n}\) 我拿复数乘法实现的,最后第 \(n\) 个点的位置需解个直线方程。
随机次数最多大概是 \(2\)(别问我怎么知道的 qwq),时间复杂度 \(\mathcal O(\text{能过)}\)
const int MAXN=100;
const double Pi=acos(-1);
const double EPS=1e-6;
int n;
double len[MAXN+5];
struct point{
double x,y;
point(double _x=0,double _y=0):x(_x),y(_y){}
point operator +(const point &rhs) const{return point(x+rhs.x,y+rhs.y);}
point operator -(const point &rhs) const{return point(x-rhs.x,y-rhs.y);}
point operator *(const double &rhs) const{return point(x*rhs,y*rhs);}
point operator /(const double &rhs) const{return point(x/rhs,y/rhs);}
double operator ~() const{return sqrt(x*x+y*y);}
} p[MAXN+5];
int main(){
srand(time(0));scanf("%d",&n);
if(n<=4) return puts("No solution")&0;
double ang=2*Pi/n;
while(1){
for(int i=1;i<n;i++) len[i]=600+i*0.1;
random_shuffle(len+1,len+n);
p[1]=point(0,0);p[2]=point(len[1],0);
for(int i=3;i<=n;i++){
point dif=p[i-1]-p[i-2];
point coe=point(cos(ang),sin(ang));
point nw=point(dif.x*coe.x-dif.y*coe.y,dif.x*coe.y+dif.y*coe.x);
nw=nw*(len[i-1]/len[i-2]);
if(i^n) p[i]=p[i-1]+nw;
else{
double k1=nw.y/nw.x;
double b=p[i-1].y-k1*p[i-1].x;
double k2=tan(Pi/n*(n-2));
p[i].x=b/(k2-k1);p[i].y=k2*p[i].x;
}
} bool flg=(~(p[1]-p[n])<1000+EPS);
for(int i=1;i<n;i++) flg&=(fabs((~(p[1]-p[n]))-len[i])>EPS);
if(flg) break;
}
for(int i=1;i<=n;i++) printf("%.10lf %.10lf\n",p[i].x,p[i].y);
return 0;
}
Codeforces 306D - Polygon(随机化+乱搞)的更多相关文章
- BZOJ1278: 向量vector(计算几何 随机化乱搞)
题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- Codeforces 1077E (二分乱搞或者dp)
题意:给你一个数组,可以从中选区若干种元素,但每种元素选区的个数前一种必须是后一种的2倍,选区的任意2种元素不能相同,问可以选取最多的元素个数是多少? 思路1(乱搞):记录一下每种元素的个数,然后暴力 ...
- codeforces 664B B. Rebus(乱搞题)
题目链接: B. Rebus time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)
A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序
题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可 ...
- Codeforces 538G - Berserk Robot(乱搞)
Codeforces 题目传送门 & 洛谷题目传送门 一道很神的乱搞题 %%% 首先注意到如果直接去做,横纵坐标有关联,不好搞.这里有一个非常套路的技巧--坐标轴旋转,我们不妨将整个坐标系旋转 ...
- codeforces 653C C. Bear and Up-Down(乱搞题)
题目链接: C. Bear and Up-Down time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- codeforces 665C C. Simple Strings(乱搞)
题目链接: C. Simple Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
随机推荐
- javascript-原生-函数
本节呢讲解js的函数部分,js函数部分总共分为两大类:1.自定义函数.2.系统函数 说白了,系统函数就是js自己内置的函数,其他的都属于自定义函数. 1.自定义函数 函数是完成指定功能的程序段,可以反 ...
- FastAPI 学习之路(四十六)WebSockets(二)
上一篇文章,我们分享了WebSockets一些入门的,我们这节课,在原来的基础上,对于讲解的进行一个演示.我们最后分享了依赖token等.首先我们对上次的代码进行调整. 我们之前分享FastAPI 学 ...
- 模拟赛18 T1 施工 题解
前言: 真的是不容易啊.这个题在考场上想到了最关键的性质,但是没写出来. 后来写出来,一直调,小错不断. 没想到改的最后一个错误是两个int 乘起来爆了int 其实最后我还是觉得复杂度很假.\(n^2 ...
- vs2010中release模式下调试程序
debug模式调试信息全,但是速度很慢,在数据量比较大的时候非常影响调试效率,release模式速度快,但是没有调试信息.所以在编译的时候很多编译器会提供一种折中的编译方式,在release下提供调试 ...
- 用STM32内置的高速ADC实现简易示波器
做一个数字采样示波器一直是我长久以来的愿望,不过毕竟这个目标难度比较大,涉及的方面实在太多,模拟前端电路.高速ADC.单片机.CPLD/FPGA.通讯.上位机程序.数据处理等等,不是一下子就能成的,慢 ...
- 用Python画如此漂亮的专业插图 ?简直So easy!
本文整理自知乎问答,仅用于学术分享,著作权归作者所有.如有侵权,请联系我删文处理.多多转发,多多学习! 方法一 强烈推荐 Python 的绘图模块 matplotlib: python plottin ...
- eclipse配置Tomcat和Tomcat出现无效端口解决办法
一.eclipse配置Tomcat 1. 按图选择window-preferences 2在server处选择runtime environment . 3.点击右侧add,选择自己的Tomcat版本 ...
- 『动善时』JMeter基础 — 56、JMeter使用命令行模式生成HTML测试报告
目录 1.自动生成HTML图形化报告 2.使用已有的测试结果文件生成HTML报告 3.HTML图形化报告内容详解 (1)Dashboard页面:(重点查看) (2)Charts页面:(辅助分析) 4. ...
- 痞子衡嵌入式:聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上的普通GPIO与高速GPIO差异. GPIO 可以说是 MCU 上最简单最常用的外设模块了,当一些原生功能外设接口模块不能 ...
- ELK集群之metricbeat(9)
Metricbeat包的安装及简单使用 Metricbeat包的安装及简单使用 系统数据采集 Python -> ES -> Grafana metricbeat的安装 metricbea ...