1.题目:poj 2187 最远点对(的平方)
模板代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=50005;
int top;
struct node
{
int x,y;
}c[maxn],st[maxn];
int n;
int cal(node s,node a,node b) //叉乘
{
return (b.y-s.y)*(a.x-s.x)-(a.y-s.y)*(b.x-s.x);
}
int dist(node a,node b) //两点距离的平方
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int get_ss(int i,int j,int k)//计算三点围成三角形的面积
{
node a,b;
a.x=st[j].x-st[i].x;
a.y=st[j].y-st[i].y;
b.x=st[k].x-st[i].x;
b.y=st[k].y-st[i].y;
return abs(a.x*b.y-a.y*b.x);
}
bool cmp(const node &a,const node &b)
{
int m=cal(c[0],a,b);
if(m>0) return 1;
if(m==0&&dist(c[0],b)>dist(c[0],a)) return 1;
return 0;
}
void graham()
{
st[0]=c[0];
st[1]=c[1];
top=1;
for(int i=2;i<n;i++)
{
while(top>0&&cal(st[top-1],st[top],c[i])<=0)
top--;
st[++top]=c[i];
}
st[++top]=c[0];
}
int kake() //旋转卡壳求最远点对
{
int d=0,p=1;
for(int i=0;i<top;i++)
{
while(get_ss(i,i+1,p+1)>get_ss(i,i+1,p))
p=(p+1)%top;
d=max(d,max(dist(st[i],st[p]),dist(st[i+1],st[p])));
}
return d;
}
int main()
{
scanf("%d",&n);
int id=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&c[i].x,&c[i].y);
if(c[i].y<c[id].y)id=i;
else if(c[i].y==c[id].y&&c[i].x<c[id].x) id=i;
}
swap(c[0],c[id]);
sort(c+1,c+n,cmp);//极角排序
graham();
printf("%d\n",kake());
return 0;
}
2.题目 poj 2079 最三角形最大面积
模板代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 50005;
struct Point{
int x,y;
}p[N],Stack[N];
int n;
int mult(Point a,Point b,Point c){
return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
int dis(Point a,Point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int cmp(Point a,Point b){
if(mult(a,b,p[0])>0) return 1;
if(mult(a,b,p[0])==0&&dis(b,p[0])>dis(a,p[0])) return 1;
return 0;
}
int Graham(){
//找到最左下角的点,作为起始点
int k = 0;
for(int i=1;i<n;i++){
if(p[k].y>p[i].y||(p[k].y==p[i].y)&&(p[k].x>p[i].x)){
k=i;
}
}
swap(p[0],p[k]);
// 按极角从小到大,距离从小到大排序
sort(p+1,p+n,cmp);
//开始扫描,求出凸包顶点
int top = 2;
Stack[0]=p[0];
Stack[1]=p[1];
Stack[2]=p[2];
for(int i=3;i<n;i++){
while(top>=1&&mult(p[i],Stack[top],Stack[top-1])>=0){
top--;
}
Stack[++top]=p[i];
}
return top;
}
double rotating_calipers(int top){ //旋转卡壳
int p=1,q=2; ///初始化
double ans = 0;
Stack[++top]=Stack[0];
for(int i = 0;i<top;i++){
while(mult(Stack[i],Stack[p],Stack[q+1])>mult(Stack[i],Stack[p],Stack[q])){
q= (q+1)%top; ///定点i,p,q,先I,p固定,让q旋转找到最大的面积三角形,还是利用了凸包的单峰函数
}
ans = max(ans,mult(Stack[i],Stack[p],Stack[q])/2.0);
while(mult(Stack[i],Stack[p+1],Stack[q])>mult(Stack[i],Stack[p],Stack[q])){
p=(p+1)%top; ///i,q固定,p旋转,找到最大的三角形面积,比较记录.
}
ans = max(ans,mult(Stack[i],Stack[p],Stack[q])/2.0);
}
return ans;
}
int main()
{
while(scanf("%d",&n)!=EOF,n!=-1){
for(int i=0;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
int top = Graham();
double ans =rotating_calipers(top);
printf("%.2f\n",ans);
}
return 0;
}
3. 区别:
就在卡壳代码处有所不同,记住就好。。。。。。。。(敷衍)
阿里云建站—为企业提供互联网“快”服务
2020年因为一场突如其来的疫情,不少企业受到了严重冲击,疫情的冲击力对传统“纯线
下”行业的危害最大,互联网女皇玛丽·米克(MaryMeeker)4月17日发布了著名的年度互
联网趋势报告,报告中指出:拥有强大的互联网线上线下融合能力的企业在疫情中的表现最好,
线上线下融合的趋势已经存在一段时间了,但是疫情让这种需求变得更加的迫切。
如果你的企业完全依附于传统的、纯线下的经验模式,那么在2020年你将“必死无疑”,
一场巨大的,前所未有的互联网革命已经到来!
阿里云建站为了助力各行各业复工复产,疫情期间“马不停蹄”为数以万计的企业快速完成
建站,为他们朝着“线上线下融合”或者“纯线上”的互联网经营模式迈进,打下了坚实的基础。
“云·速成美站”模板建站1天就能上线,不懂技术没关系,打字就能建网站。千套网站模
板免费提供,百元就能建官网,一价全包,无任何隐形消费。
“云·企业官网”定制建站1周就能上线,高端量身定制建站,千元建官网无需自己动手,
建站专家1对1网站策划及设计,专业省心之选。
疫情,是一场大浪淘沙,每一次危机背后都隐藏着机会,危机越大,机会也越大。大环境
已经改变,如果你不努力不去改变来迎合这个大环境,那你必将被淘汰。
阿里云助力企业建站,优惠多多,福利多多,详情请点击如下链接
红包+折扣,阿里云上云大礼包! https://www.aliyun.com/minisite/goods?userCode=iqk6z2im