[FJSC2014]圈地

【题目描述】

  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)

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

 

 1 #include<cstdio>
 2 #include<ctime>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 const double pi=3.1415926535897932384626;
 7 struct P{double x,y;}a[1010],z,b[1010];int n,k;double ans=1e10,tmp,t;
 8 bool operator<(P const&a,P const&b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
 9 P operator+(P const&a,P const&b){return (P){a.x+b.x,a.y+b.y};}
10 P operator-(P const&a,P const&b){return (P){a.x-b.x,a.y-b.y};}
11 P operator*(P const&a,double p){return (P){a.x*p,a.y*p};}
12 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};}
13 double cross(P const&a,P const&b){return a.x*b.y-a.y*b.x;}
14 double dot(P const&a,P const&b){return a.x*b.x+a.y*b.y;}
15 int main()
16 {
17     scanf("%d",&n);int i,j;k=(int)sqrt(n)+10;//srand(time(0));
18     for(i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);
19     if(n<=300)
20     {
21         for(i=1;i<n;i++)
22         for(j=i+1;j<n;j++)
23         for(k=j+1;k<=n;k++)
24         {
25             tmp=std::abs(cross(a[k]-a[i],a[j]-a[i]));
26             if(ans>tmp)ans=tmp;
27         }
28         printf("%.2lf\n",ans/2.0);
29     }
30     else{int p1=31,p2=23;
31         for(int tt=1;tt<=p1;tt++)
32         {
33             z=(P){cos(pi/p2*tt),sin(pi/p2*tt)};
34             for(i=1;i<=n;i++)b[i]=a[i]*z;
35             std::sort(b+1,b+1+n);
36             for(int kk=1;(kk-1)*k<=n;kk++)
37             for(i=(k*(kk-1)+1);i<n&&i<k*kk;i++)
38             for(j=i+1;j<n&j<k*kk;j++)
39             for(int l=j+1;l<=n&&l<k*kk;l++)
40             {
41                 tmp=std::abs(cross(b[l]-b[i],b[j]-b[i]));
42                 if(ans>tmp)ans=tmp;
43             }
44         }
45         printf("%.2lf\n",ans/2.0);
46     }
47 }
View Code

转载于:https://www.cnblogs.com/Trinkle/p/3851824.html

-- 创建表结构 CREATE TABLE RSXT_JXKH_KHZB ( ID BIGINT NOT NULL, KHZB VARCHAR(256) NOT NULL, ZBSM VARCHAR(256) NOT NULL, SYDX TINYINT NOT NULL, KHLX TINYINT NOT NULL, SXRQ DATE NOT NULL, BZXX TEXT, FJSC VARCHAR(256), CREATOR VARCHAR(64), CREATE_TIME DATETIME DEFAULT SYSDATE NOT NULL, UPDATER VARCHAR(64), UPDATE_TIME DATETIME DEFAULT SYSDATE NOT NULL, DELETED BIT DEFAULT 0 NOT NULL, PRIMARY KEY (ID) ); COMMENT ON TABLE FRAMEWORK_BASE.RSXT_JXKH_KHZB IS '考核指标配置表'; -- 为每个字段添加注释 EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'ID', '主键ID,唯一标识考核指标记录'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'KHZB', '考核指标名称'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'ZBSM', '指标详细说明,解释指标含义和考核标准'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'SYDX', '适用对象类型:1=部门,2=岗位-正职,3=岗位-副职,4=岗位-员工,5=子公司,6=子公司负责人'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'KHLX', '考核类型:1=年度考核,2=季度考核'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'SXRQ', '指标生效日期,从该日期起指标开始适用'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'BZXX', '备注信息,存储指标相关的补充说明'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'FJSC', '附件存储路径,记录与指标相关的附件文件地址'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'CREATOR', '创建者,记录指标的创建人账号'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'CREATE_TIME', '创建时间,自动记录指标的创建时间戳'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'UPDATER', '更新者,记录最后修改指标的用户账号'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'UPDATE_TIME', '更新时间,自动记录指标最后修改的时间戳'); EXEC SP_COLUMNCOMMENT('RSXT_JXKH_KHZB', 'DELETED', '删除标记:0=未删除,1=已删除(逻辑删除)'); 转换
08-20
本文档旨在帮助开发者搭建STM8单片机的开发环境,并创建基于标准库的工程项目。通过本文档,您将了解如何配置开发环境、下载标准库、创建工程以及进行基本的工程配置。 1. 开发环境搭建 1.1 软件准备 IAR Embedded Workbench for STM8: 这是一个集成开发环境,具有高度优化的C/C++编译器和全面的C-SPY调试器。它为STM8系列微控制器提供全面支持。 STM8标准库: 可以从STM官网下载最新的标准库文件。 1.2 安装步骤 安装IAR: 从官网下载并安装IAR Embedded Workbench for STM8。安装过程简单,按照提示点击“下一步”即可完成。 注册IAR: 注册过程稍微繁琐,但为了免费使用,需要耐心完成。 下载STM8标准库: 在STM官网搜索并下载最新的标准库文件。 2. 创建标准库工程 2.1 工程目录结构 创建工作目录: 在自己的工作目录下创建一个工程目录,用于存放IAR生成的文件。 拷贝标准库文件: 将下载的标准库文件拷贝到工作目录中。 2.2 工程创建步骤 启动IAR: 打开IAR Embedded Workbench for STM8。 新建工程: 在IAR中创建一个新的工程,并将其保存在之前创建的工程目录下。 添加Group: 在工程中添加几个Group,分别用于存放库文件、自己的C文件和其他模块的C文件。 导入C文件: 右键Group,导入所需的C文件。 2.3 工程配置 配置芯片型号: 在工程选项中配置自己的芯片型号。 添加头文件路径: 添加标准库的头文件路径到工程中。 定义芯片宏: 在工程中定义芯片相关的宏。 3. 常见问题与解决方案 3.1 编译错误 错误1: 保存工程时报错“ewp could not be written”。 解决方案: 尝试重新创建工程,不要在原路径下删除工程文件再创建。 错误
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值