【题目描述】

  2维平面上有n个木桩,黄学长有一次圈地的机会并得到圈到的土地,为了体现他的高风亮节,他要使他圈到的土地面积尽量小。圈地需要圈一个至少3个点的多边形,多边形的顶点就是一个木桩,圈得的土地就是这个多边形内部的土地。(因为黄学长非常的神,所以他允许圈出的第n点共线,那样面积算0)

【输入格式】

  第一行一个整数n,表示木桩个数。
  接下来n行,每行2个整数表示一个木桩的坐标,坐标两两不同。

【输出格式】

  仅一行,表示最小圈得的土地面积,保留2位小数。

【样例输入】

样例1:
3

0 0

0 1

1 0

样例2:
4

0 0

0 1

0 2

1 1

【样例输出】

样例1:
0.50
样例2:
0.00
【数据范围】

  对于10%的数据,n<=100;
  对于30%的数据,n<=300;
  对于50%的数据,n<=500;
  对于100%的数据,n<=1000。

Solution

  这题被我乱搞搞掉了= =

  暴力n^3不多说。但是有很多时候的情况是没有用的。于是我们把这些点分成sqrt(n)块,块内暴力,轻松愉快。

  这样做不靠谱,所以我们可以随机旋转坐标系,rand个四五十次就可以把这题水过了。

出题人题解:

  显然,这时候暴力枚举会T。于是我们转变一下思路,如果我们确定了2个点以后,第三个点有必要去盲目的枚举吗?答案是否定的。实际上我们把经过这两点的线看成一个斜率,把他当成y轴你会发现第三个点明显是在坐标系左右找一个离”y轴”最近的点来算面积更新答案。然后我们可以继续思考,发现我们可以把点按照某个斜率当成”y轴”进行“从左到右”的排序,这样当2点共线的时候,用这两个点的左右2个点去更新答案就好了。也就是说我们采用旋转坐标系的方法,一开始按x坐标排好序,认为直接用竖着的那条斜率,然后维护的话每次其实当两点共线后只要交换他们就能得到斜率转过该事件点的序列。所以我们可以预处理出所有可行的斜率,当成事件点,不断转动坐标系更新答案就好。这样复杂度只有n^2,期望得分100.(这确实只是个暴力的优化 啊。。。不要砸我T_T)

(好像很复杂的样子。。。)

 #include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<algorithm>
const double pi=3.1415926535897932384626;
struct P{double x,y;}a[],z,b[];int n,k;double ans=1e10,tmp,t;
bool operator<(P const&a,P const&b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
P operator+(P const&a,P const&b){return (P){a.x+b.x,a.y+b.y};}
P operator-(P const&a,P const&b){return (P){a.x-b.x,a.y-b.y};}
P operator*(P const&a,double p){return (P){a.x*p,a.y*p};}
P operator*(P const&a,P const&b){return (P){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
double cross(P const&a,P const&b){return a.x*b.y-a.y*b.x;}
double dot(P const&a,P const&b){return a.x*b.x+a.y*b.y;}
int main()
{
scanf("%d",&n);int i,j;k=(int)sqrt(n)+;//srand(time(0));
for(i=;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);
if(n<=)
{
for(i=;i<n;i++)
for(j=i+;j<n;j++)
for(k=j+;k<=n;k++)
{
tmp=std::abs(cross(a[k]-a[i],a[j]-a[i]));
if(ans>tmp)ans=tmp;
}
printf("%.2lf\n",ans/2.0);
}
else{int p1=,p2=;
for(int tt=;tt<=p1;tt++)
{
z=(P){cos(pi/p2*tt),sin(pi/p2*tt)};
for(i=;i<=n;i++)b[i]=a[i]*z;
std::sort(b+,b++n);
for(int kk=;(kk-)*k<=n;kk++)
for(i=(k*(kk-)+);i<n&&i<k*kk;i++)
for(j=i+;j<n&j<k*kk;j++)
for(int l=j+;l<=n&&l<k*kk;l++)
{
tmp=std::abs(cross(b[l]-b[i],b[j]-b[i]));
if(ans>tmp)ans=tmp;
}
}
printf("%.2lf\n",ans/2.0);
}
}

[FJSC2014]圈地的更多相关文章

  1. QQ空间/朋友圈类界面的搭建

    类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...

  2. Python微信-- 分享接口(分享到朋友圈、朋友、空间)

    生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...

  3. BJITJobs : 北京IT圈高端职位招聘信息,成功率最高的高端求职渠道

    你有实力,但比你差的人都升了,你的师弟都年薪50万了,你还是找不到机会.为什么你离高端机会总是差一步呢?其实你离成功就差一次机会,一个适合你的高端职位的信息! 招聘网站不靠谱:三大网站都是低端职位为主 ...

  4. WPF 自定义绕圈进度条

    在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...

  5. Apple Watch版微信来了 收发微信刷朋友圈不在话下

    昨晚果粉守了一夜的Apple Watch发布会,意料中的惊喜不少,最让人兴奋的是微信成为首批支持的应用.是的,在全球拥有4.68亿月活跃用户的微信怎么可能不第一时间入驻呢?之前我们就有聊过Apple ...

  6. UC浏览器 分享到朋友圈和微信好友 分类: JavaScript 2015-04-28 14:45 615人阅读 评论(1) 收藏

    用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...

  7. nyist 78 圈水池

    http://acm.nyist.net/JudgeOnline/problem.php?pid=78 圈水池 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一个 ...

  8. iOS版微信朋友圈数据库的简要分析

    本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!原文地址:http://www.cnblogs.com/cxun/p/4550523.html 之前写了一些关于微信聊天记录的博文之后,不少 ...

  9. Evacuation Plan-POJ2175最小费用消圈算法

    Time Limit: 1000MS Memory Limit: 65536K Special Judge Description The City has a number of municipal ...

随机推荐

  1. UIView转场动画属性设置

    常规动画属性设置(可以同时选择多个进行设置) UIViewAnimationOptionLayoutSubviews:动画过程中保证子视图跟随运动. UIViewAnimationOptionAllo ...

  2. asp.net:repeater嵌套(常用于新闻等在首页归类显示)

    using System;using System.Configuration;using System.Collections.Generic;using System.Linq;using Sys ...

  3. CSS当中color的四种表示方法

    这是我的第一篇博客,所以写的东西会比较简单. css当中,好多地方都会用到color属性,用来使html内容丰富多彩,例如:background-color:border-color: 第一种表示法使 ...

  4. SGU 260.Puzzle (异或高斯消元)

    题意: 有n(<200)个格子,只有黑白两种颜色.可以通过操作一个格子改变它和其它一些格子的颜色.给出改变的关系和n个格子的初始颜色,输出一种操作方案使所有格子的颜色相同. Solution: ...

  5. Spring in action笔记

    耦合的两面性     一方面代码耦合难以测试,会出现打地鼠式的bug特性(修复一个bug,引发另一个bug) 另一方面耦合又是必须的,不同的类必须要进行适当的交互,才能实现功能. bean的四种装配方 ...

  6. PHPUML 生成UML

    Selecting the UML/XMI version To select which version of the UML/XMI standards you want your XMI to ...

  7. Android Activity 生命周期详解

    学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...

  8. JavaScript的问题

    定义一个函数function, function testParams() { var params = ""; for(var i=0; i<arguments.lengt ...

  9. 【转】Ext.ajax.request 中的success和failure

    原文链接:Ext.ajax.request 中的success和failure Ajax request对象的success事件表示request过程中没有发生错误,和自己的业务逻辑无关, 如果访问不 ...

  10. js获取url的get传值函数

    function getvl(name) { var reg = new RegExp("(^|\\?|&)"+ name +"=([^&]*)(\\s| ...