UVA 10173 旋转卡壳

题意:
给出一些点,求最小的覆盖这些点的矩形的面积。

 

题解:

枚举下边界(是一条边),然后暴力卡壳左右边界(点),再暴力上边界(点),更新答案。

 

View Code
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <cmath>
  7 
  8 #define N 2222
  9 #define EPS 1e-7
 10 #define INF 1e20
 11 
 12 using namespace std;
 13 
 14 struct PO
 15 {
 16     double x,y;
 17 }p[N],stk[N],o;
 18 
 19 int n,top;
 20 int s[10];
 21 double ans;
 22 
 23 inline int dc(double x)
 24 {
 25     if(x>EPS) return 1;
 26     else if(x<-EPS) return -1;
 27     return 0;
 28 }
 29 
 30 inline bool cmp(const PO &a,const PO &b)
 31 {
 32     if(dc(a.x-b.x)==0) return a.y<b.y;
 33     return a.x<b.x;
 34 }
 35 
 36 inline PO operator +(PO a,PO b)
 37 {
 38     PO c;
 39     c.x=a.x+b.x;
 40     c.y=a.y+b.y;
 41     return c;
 42 }
 43 
 44 inline PO operator -(PO a,PO b)
 45 {
 46     PO c;
 47     c.x=a.x-b.x;
 48     c.y=a.y-b.y;
 49     return c;
 50 }
 51 
 52 inline double cross(PO &a,PO &b,PO &c)
 53 {
 54     return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
 55 }
 56 
 57 inline double getangle(PO &a,PO &b,PO&c,PO &d)
 58 {
 59     PO t=c+(a-d);
 60     return cross(b,a,t);
 61 }
 62 
 63 inline PO getfline(PO &a,PO &b,PO &c)//得到垂线 
 64 {
 65     PO d=c-b,e;
 66     e.x=a.x-d.y;
 67     e.y=a.y+d.x;
 68     return e;
 69 }
 70 
 71 inline double getdis(PO &a,PO &b)
 72 {
 73     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
 74 }
 75 
 76 inline double getdis_ps(PO &a,PO &b,PO &c)
 77 {
 78     return fabs(cross(a,b,c))/getdis(b,c);
 79 }
 80 
 81 inline void getside()
 82 {
 83     for(int i=0;i<4;i++) s[i]=0;
 84     for(int i=1;i<top;i++)
 85     {
 86         if(dc(stk[i].y-stk[s[0]].y)<0) s[0]=i;
 87         if(dc(stk[i].x-stk[s[1]].x)<0) s[1]=i;
 88         if(dc(stk[i].y-stk[s[2]].y)>0) s[2]=i;
 89         if(dc(stk[i].x-stk[s[3]].x)>0) s[3]=i;
 90     }
 91     // 0 == ymin, 1 == xmin, 2 == ymax ,3 == xmax;
 92 }
 93 
 94 inline void rotating_calipers()
 95 {
 96     getside();
 97     int tmp=s[0];
 98     ans=INF;
 99     do
100     {//枚举下边界(直线) 
101         PO t=getfline(stk[s[0]],stk[s[0]],stk[(s[0]+1)%top]);
102         while(dc(getangle(t,stk[s[0]],stk[s[1]],stk[(s[1]+1)%top]))<0) s[1]=(s[1]+1)%top;//卡右边界 
103         while(dc(getangle(stk[s[0]],t,stk[s[3]],stk[(s[3]+1)%top]))<0) s[3]=(s[3]+1)%top;//卡做边界 
104         while(dc(getdis_ps(stk[(s[2]+1)%top],stk[s[0]],stk[(s[0]+1)%top])-
105                 getdis_ps(stk[s[2]],stk[s[0]],stk[(s[0]+1)%top]))>0) s[2]=(s[2]+1)%top;//卡上边界 
106         double a=getdis_ps(stk[s[2]],stk[s[0]],stk[(s[0]+1)%top]);
107         t=getfline(stk[s[3]],stk[s[0]],stk[(s[0]+1)%top]);
108         double b=getdis_ps(stk[s[1]],stk[s[3]],t);
109         ans=min(ans,a*b);
110         s[0]=(s[0]+1)%top;
111     }while(s[0]!=tmp);
112 }
113 
114 inline void graham()
115 {
116     sort(p+1,p+1+n,cmp);
117     top=-1;
118     stk[++top]=p[1]; stk[++top]=p[2];
119     for(int i=3;i<=n;i++)
120     {
121         while(top>=1&&dc(cross(stk[top-1],stk[top],p[i]))<=0) top--;
122         stk[++top]=p[i];
123     }
124     int tmp=top;
125     for(int i=n-1;i>=1;i--)
126     {
127         while(top>=tmp+1&&dc(cross(stk[top-1],stk[top],p[i]))<=0) top--;
128         stk[++top]=p[i];
129     }
130 }
131 
132 inline void read()
133 {
134     for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
135 }
136 
137 inline void go()
138 {
139     if(n<=2) ans=0.0;
140     else graham(),rotating_calipers();
141     printf("%.4lf\n",ans);
142 }
143 
144 int main()
145 {
146     while(~scanf("%d",&n)&&n) read(),go();
147     return 0;
148 }

 

这题傻X了,凸包写错了。。查了好久,都改得和题解一样了。。。~~~~(>_<)~~~~ 

 

 

一下自己yy的。

 

View Code
  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <algorithm>
  6 #include <cmath>
  7 
  8 #define N 2020
  9 #define EPS 1e-7
 10 
 11 using namespace std;
 12 
 13 struct PO
 14 {
 15     double x,y;
 16     inline void prt() {printf("%lf     %lf\n",x,y);}
 17 }p[N],stk[N],res[N],o;
 18 
 19 int n,tot;
 20 
 21 inline void read()
 22 {
 23     for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
 24 }
 25 
 26 inline int dc(double x)
 27 {
 28     if(x>EPS) return 1;
 29     else if(x<-EPS) return -1;
 30     return 0;
 31 }
 32 
 33 inline bool cmp(const PO &a,const PO &b)
 34 {
 35     if(dc(a.x-b.x)==0) return a.y<b.y;
 36     return a.x<b.x;
 37 }
 38 
 39 inline PO operator +(PO a,PO b)
 40 {
 41     a.x+=b.x; a.y+=b.y;
 42     return a;
 43 }
 44 
 45 inline PO operator -(PO a,PO b)
 46 {
 47     a.x-=b.x; a.y-=b.y;
 48     return a;
 49 }
 50 
 51 inline double cross(PO &a,PO &b,PO &c)
 52 {
 53     return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
 54 }
 55 
 56 inline double dot(PO &a,PO &b,PO &c)
 57 {
 58     return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y);
 59 }
 60 
 61 inline double getdis(PO &a,PO &b)
 62 {
 63     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
 64 }
 65 
 66 inline void graham()
 67 {
 68     sort(p+1,p+1+n,cmp);
 69     tot=-1; int top=0;
 70     for(int i=1;i<=n;i++)
 71     {
 72         while(top>=2&&dc(cross(stk[top-1],stk[top],p[i]))<=0) top--;
 73         stk[++top]=p[i];
 74     }
 75     for(int i=1;i<=top;i++) res[++tot]=stk[i];
 76     top=0;
 77     for(int i=n;i>=1;i--)
 78     {
 79         while(top>=2&&dc(cross(stk[top-1],stk[top],p[i]))<=0) top--;
 80         stk[++top]=p[i];
 81     }
 82     for(int i=2;i<=top;i++) res[++tot]=stk[i];
 83 }
 84 
 85 inline int getangle_dot(PO &a,PO &b,PO &c,PO &d)
 86 {
 87     PO e=d-(c-a);
 88     return dc(dot(a,b,e));
 89 }
 90 
 91 inline double getangle_cross(PO &a,PO &b,PO &c,PO &d)
 92 {
 93     PO e=d-(c-a);
 94     return dc(cross(a,b,e));
 95 }
 96 
 97 inline double getlen(PO &a)
 98 {
 99     return sqrt(a.x*a.x+a.y*a.y);
100 }
101 
102 inline double getty(PO &a,PO &b)
103 {
104     return dot(o,a,b)/getlen(b);
105 }
106 
107 inline void rotating_calipers()
108 {
109     double ans=1e20;
110     PO sa,sb;
111     for(int i=0;i<tot;i++)
112     {
113         int rt=(i+1)%tot;
114         while(getangle_dot(res[i],res[(i+1)%tot],res[rt],res[(rt+1)%tot])>0) rt=(rt+1)%tot;
115         int lt=i;
116         while(getangle_dot(res[i],res[(i+1)%tot],res[(lt-1+tot)%tot],res[lt])>0) lt=(lt-1+tot)%tot;
117         int usp=(i+1)%tot;
118         while(getangle_cross(res[i],res[i+1],res[usp],res[(usp+1)%tot])>0) usp=(usp+1)%tot;
119         double h=fabs(cross(res[i],res[i+1],res[usp]))/getdis(res[i],res[i+1]);
120         sa=res[rt]-res[lt]; sb=res[i+1]-res[i];
121         ans=min(ans,fabs(h*getty(sa,sb)));
122     }
123     printf("%.4lf\n",ans);
124 }
125 
126 inline void go()
127 {
128     graham();
129     if(tot<=2) printf("0.0000\n");
130     else if(tot==3)  printf("%.4lf\n",fabs(cross(res[0],res[1],res[2])));
131     else rotating_calipers();
132 }
133 
134 int main()
135 {
136     while(scanf("%d",&n),n)read(),go();
137     return 0;
138 }

 

 

转载于:https://www.cnblogs.com/proverbs/archive/2013/02/25/2932721.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Requests 丨爬虫基础入门

据说&#xff1a;看我文章的帅帅 都有个习惯&#xff1a;先点赞、收藏再看 目录 ⚽️ 一、背景知识&#xff1a;requests &#x1f3c0; 1、pip安装requests &#x1f3c8; 2、pycharm安装requests ⚾️ 3、一行代码使用requests &#x1f3be; 4、requests常用调用&…

类脑计算:让人工智能走得更远

来源&#xff1a;中国科学报像人一样思考&#xff0c;这是人们对人工智能和机器人的期待。大踏步前进的人工智能&#xff0c;似乎走到了十字路口。“机器综合智能水平和人脑相差较大&#xff0c;机器学习需要较多人工干预&#xff0c;不同人工智能模态之间交互协同较少……”近…

Android之Fragment(一)

Fragment的产生与介绍 Android运行在各种各样的设备中&#xff0c;有小屏幕的手机&#xff0c;超大屏的平板甚至电视。针对屏幕尺寸的差距&#xff0c;很多情况下&#xff0c;都是先针对手机开发一套App&#xff0c;然后拷贝一份&#xff0c;修改布局以适应平板神马超级大屏的…

《Python快速入门》基础知识扫盲课

据说:看我文章的帅帅 都有个习惯:先点赞、收藏再看 目录 🐜 1、Python 初体验 Pycharm 第一个程序 交互式编程第一个程序

数字技术对就业的影响分析

来源&#xff1a; 腾讯研究院技术是增长之源&#xff0c;就业是民生之本。技术进步对就业具有双重影响&#xff0c;它不仅带来新的工作机会&#xff0c;改善人们的生活&#xff1b;也会替代一些原有岗位&#xff0c;带来“技术性失业”。1930年&#xff0c;英国伟大的经济学家凯…

Android之Fragment(二)

本文主要内容 如何管理Fragment回退栈 Fragment如何与Activity交互 Fragment与Activity交互的最佳实践 没有视图的Fragment的用处 使用Fragment创建对话框 如何与ActionBar&#xff0c;MenuItem集成等 管理Fragment回退栈 类似与Android系统为Activity维护一个任务栈&#…

带你薅“云”羊毛:定个小目标,先薅他一年

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 一、2022年了&#xff0c;一块钱能干什么&#xff1f; 1块钱 能买一瓶矿泉水 1块钱 能坐一次公交 1块钱 竟然能买来一年的云服务器 哈哈哈&#xff0c;今天西红柿就带大家一块钱白嫖京东云服务器&#xff0c;当然&#xff0c;氪金也是…

ubuntu下搭建android开发环境(转载)

在ubuntu下搭建android开发环境&#xff0c;准备学习一下android开发。 1、安装JDK 首先到oracle的官网上下载linux版本的JDK&#xff08;网址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26&#xff0d;download-400750.html&#xff09;&#x…

《瓦森纳协定》——光刻机为什么就是不卖给中国!

来源&#xff1a;金属加工&#xff08;ID&#xff1a;mw1950pub&#xff09;谈起光刻机相信大家首先想到的是荷兰&#xff0c;确实如此&#xff0c;荷兰光刻机在全球都是数一数二的&#xff0c;就连最顶尖的光刻机制造公司ASML也位于荷兰&#xff0c;二荷兰光刻机之所以这么出名…

Material Design入门(三)

本文主要包括 CollapsingToolbarLayout实现滚动动画效果 ViewPagertabLayout实现左右类Tab效果 控件介绍 这次需要用到得新控件比较多&#xff0c;主要有以下几个&#xff1a; CoordinatorLayout 组织它的子views之间协作的一个Layout&#xff0c;它可以给子View切换提供…

干货|2018物流机器人行业报告发布!不容错过

来源&#xff1a;楼今岁阅 摘要&#xff1a;2018年&#xff0c;我们都在谈智能家居、智能交通、智能工业、智能安防等热门物联网话题&#xff0c;并且预计到2020年&#xff0c;中国物联网的整体规模将超过1.8万亿元。发展如此迅速&#xff0c;其涉及的领域一定会越来越广&#…

【年度回忆录】如何做到1年90000粉丝?

亲爱的小伙伴&#xff1a; 小伙伴你好&#xff0c;我是不吃西红柿&#xff0c;仅以此文作为 2021 年终总结&#xff0c;顺便跟大家分享一些博主的心得经验&#xff0c;希望你我和 CSDN 都越来越好&#xff01; 一、C站点滴 翻开 2021 CSDN 年度回忆录&#xff0c;有种难以言…

Material Design综合实例

背景知识 drawlayout的使用 recycleView的使用 CardView的使用 一些开源动画库的使用 ImageView的scaleType属性与adjustViewBounds属性 &#xff0c;参考链接&#xff1a; ImageView的android:adjustViewBounds属性 - - ITeye技术网站 Android ImageView的scaleType属性与…

DARPA将开发无需手术的神经技术,实现脑机接口

来源&#xff1a;IEEE电气电子工程师学会到目前为止&#xff0c;DARPA&#xff08;美国国防部高级研究计划局&#xff09;的神经科学项目部&#xff08;也称为国防部疯狂科学部门&#xff09;一直专注于可服务于那些因身体或大脑残疾回国的士兵的技术&#xff0c;例如&#xff…

2018年全球自动驾驶法律政策研究 | 附报告下载

来源&#xff1a;腾讯研究院摘要&#xff1a;2018年9月13日&#xff0c;在中国法学会研究部、腾讯研究院联合举办的“‘法律人的互联网思维’系列研修会第二期——自动驾驶汽车的技术、产业和法律维度”上&#xff0c;腾讯研究院发布《2018年全球自动驾驶法律政策研究报告》。0…

全球最具影响力AI机构TOP100排名:中国5所高校1所研究院入围

来源&#xff1a;学术头条&#xff08;SciTouTiao&#xff09;现在“人工智能”&#xff08;ArtificialIntelligence&#xff09;一词时常“做客”各大媒体平台&#xff0c;成为人们所关注的热点话题&#xff0c;而在学术圈&#xff0c;AI技术同样也是最具活力与吸引力的研究课…

安卓开源库之动画篇

本文主要介绍收集了笔者所用过的开源动画库&#xff0c;达到一些比较好看的效果。 一个富有动感的 Sheet 链接&#xff1a; zzz40500/AndroidSweetSheet: 一个富有动感的Sheet(选择器) 效果如下 示例代码 package com.zj.testsheet;import android.os.Bundle; import andr…

《Python 黑科技》代理ip奇技淫巧

点赞 ➕ 评论 ➕ 收藏 三连再看你最帅 目录 &#x1f41b; 1、什么是住宅动态ip&#xff1f; &#x1f98b; 1.1 动态ip优点是什么&#xff1f; &#x1f40c; 1.2 环境准备 &#x1f41e; 1.3 获取代理ip &#x1f41c; 2、使用代理IP &#x1f424; 2.1 浏览器使用代理…

MIT发布2018年全球10大突破性技术!

来源&#xff1a; 数字化企业作为全球最为著名的技术榜单之一&#xff0c;《麻省理工科技评论》全球十大突破性技术具备极大的全球影响力和权威性&#xff0c;至今已经举办了18年。每年上榜的技术突破&#xff0c;有的已经在现实中得以应用&#xff0c;有的还尚需时日&#xff…

Android实现监测网络状态

本文主要用到了安卓监测网络状态变化功能&#xff0c;实现了WIFI,3G,无网络状态切换时发出通知的功能。 主要知识点 servicebroadcast接口回调实现 service的基本知识 service可分为 按运行地点分类 本地服务 远程服务 按按运行类型分类&#xff1a; 前台服务后台服务按…