Codeforces 题目传送门 & 洛谷题目传送门

中考终于结束了……简单写道题恢复下状态罢。

首先这一类题目肯定没法用一般的方法解决,因此考虑用一些奇淫的乱搞做法解决这道题,不难发现,如果我们固定住了前 \(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(随机化+乱搞)的更多相关文章

  1. BZOJ1278: 向量vector(计算几何 随机化乱搞)

    题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...

  2. Codeforces 732e [贪心][stl乱搞]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...

  3. Codeforces 1077E (二分乱搞或者dp)

    题意:给你一个数组,可以从中选区若干种元素,但每种元素选区的个数前一种必须是后一种的2倍,选区的任意2种元素不能相同,问可以选取最多的元素个数是多少? 思路1(乱搞):记录一下每种元素的个数,然后暴力 ...

  4. codeforces 664B B. Rebus(乱搞题)

    题目链接: B. Rebus time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. 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 ...

  6. Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序

    题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可 ...

  7. Codeforces 538G - Berserk Robot(乱搞)

    Codeforces 题目传送门 & 洛谷题目传送门 一道很神的乱搞题 %%% 首先注意到如果直接去做,横纵坐标有关联,不好搞.这里有一个非常套路的技巧--坐标轴旋转,我们不妨将整个坐标系旋转 ...

  8. 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 ...

  9. codeforces 665C C. Simple Strings(乱搞)

    题目链接: C. Simple Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

随机推荐

  1. MarkDown之Typora使用

    Typora:所见即所得 常用快捷键 加粗:ctrl + B 标题:ctrl + 16,对于与16级标题 插入公式:ctrl + Shift + m 插入代码:ctrl + Shift + K 插入图 ...

  2. Python | 实现pdf文件分页

    不知道大家有没有遇到过这么一种情况,就比如一个pdf格式的电子书,我们经常浏览的是其中的一部分,而这电子书的页数很大,每当需要浏览时,就需要翻到对应的页码,就有点儿繁琐. 还有一些情况,比如,我们想分 ...

  3. 0x03

    指数级枚举:1到n任意选取的所有方案数: #include<bits/stdc++.h> using namespace std; int n,a[1100],vis[1100],cnt, ...

  4. hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)

    题意: 给一个m*n的矩阵,每格上有一个数. 找从第1行到第m行的一条路径,使得这条路径上的数之和最小. 路径必须满足相邻两行所选的两个数的纵坐标相邻(即一个格子必须是另一个格子的周围八个格子中的一个 ...

  5. Python——Excel转Json工具

    Python工具Excel转Json 前置条件 1.安装python 下载python 我下载的是2.7: 2.配置环境变量 我的电脑右键--属性--高级系统设置--环境变量: 添加python的安装 ...

  6. Linux oracle 导入sql文件

    1.@sql文件的路径 SQL>@/data/xx.sql; 2.导入完毕 commit;

  7. DDTP 分布式数据传输协议白皮书

    声明 本文非本人原创,主要参考文献[1]编写的阅读笔记.本博客仅发表在博客园,作者LightningStar,其他平台均为转载. 摘要 本白皮书对全球现有主要个人信息可携带权的实践模式进行梳理,分析其 ...

  8. CTF-Tools 一款CTF古典密码加解密工具

    CTF-Tools 一款CTF古典密码加解密工具 工具截图 工具简介 一款CTF编码.解码.加密.解密工具. 支持的编码解码: URL-UTF-8 URL-GB2312 Unicode Escape( ...

  9. python与C结构体之间二进制数据转换

    python与C结构体之间数据转换 前言 在实际应用中,可能会遇到直接和C进行二进制字节流协议通信,这时要把数据解包成python数据,如果可能,最好与C定义的结构体完全对应上. python中有2种 ...

  10. python3.7 pip

    Is pip the same for 3.4+ No, it's not. A single pip installation serves a single Python distribution ...