2015百度之星初赛(1)1006 旋转卡壳
矩形面积
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 97 Accepted Submission(s): 55
每组测试数据占若干行,第一行一个正整数 N(1≤N<≤1000),代表矩形的数量。接下来 N 行,每行 8 个整数x1,y1,x2,y2,x3,y3,x4,y4,代表矩形的四个点坐标,坐标绝对值不会超过10000。
第一行输出"Case #i:",i 代表第 i 组测试数据。
第二行包含1 个数字,代表面积最小的矩形的面积,结果保留到整数位。
//旋转卡壳,百度之星初赛最后一题#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define min(x,y) ((x)<(y)?(x):(y))
using namespace std;struct point
{double x,y;
}p[10005];int ans[10005],st[10005],stop,cnt,n;int DB (double d){if (fabs(d)<1e-8)return 0;return d>0?1:-1;
}
double cross (point a,point b,point c){return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
double dot(point a,point b,point c){return (a.x-c.x)*(b.x-c.x)+(a.y-c.y)*(b.y-c.y);
}
bool cmp(point A,point B){if(A.y<B.y) return true;else if(A.y==B.y){if(A.x<B.x)return true;}return false;
}void forTU(){stop=cnt=0;st[stop++]=0; st[stop++]=1;for(int i=2;i<n;i++){while(stop>1&&cross(p[i],p[st[stop-1]],p[st[stop-2]])>=0) stop--;st[stop++]=i;}for(int i=0;i<stop;i++)ans[cnt++]=st[i];stop=0; st[stop++]=n-1; st[stop++]=n-2;for(int i=n-3;i>=0;i--){while(stop>1&&cross(p[i],p[st[stop-1]],p[st[stop-2]])>=0) stop--;st[stop++]=i;}for(int i=1;i<stop;i++){ans[cnt++]=st[i];}
}double roating(){cnt--;if(n<3) return 0;int i,m=1,q=1,r;double anst=1e10,a,b,c;for(i=0;i<cnt;i++){while (DB(cross(p[ans[(i+1)]],p[ans[(m+1)]],p[ans[i]])-cross(p[ans[(i+1)]],p[ans[m]],p[ans[i]])) >0)m=(m+1)%cnt;while (DB(dot(p[ans[(q+1)]],p[ans[(i+1)]],p[ans[i]])-dot(p[ans[q]],p[ans[(i+1)]],p[ans[i]])) >0)q=(q+1)%cnt;if (i==0)r=q;while(DB(dot(p[ans[(r+1)]],p[ans[(i+1)]],p[ans[i]])-dot(p[ans[r]],p[ans[(i+1)]],p[ans[i]])) <= 0)r=(r+1)%cnt;a=cross(p[ans[(i+1)]],p[ans[m]],p[ans[i]]);b=dot(p[ans[q]],p[ans[(i+1)]],p[ans[i]])-dot(p[ans[r]],p[ans[(i+1)]],p[ans[i]]);c=dot(p[ans[(i+1)]],p[ans[(i+1)]],p[ans[i]]);anst=min(anst,a*b/c);}return anst;
}int main (){
int number;
cin>>number;
for(int numm=1;numm<=number;numm++){ cin>>n;n*=4;cout<<"Case #"<<numm<<":"<<endl;for (int i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);sort(p,p+n,cmp); forTU(); printf("%.0lf\n",roating()); } return 0;
}
2015百度之星初赛(1)1006 旋转卡壳相关推荐
- 二分搜索 2015百度之星初赛1 HDOJ 5248 序列变换
题目传送门 1 /* 2 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 3 比赛时以为是贪心,榨干智商也 ...
- 2017百度之星初赛(B)1006小小粉丝度度熊------hdu6119
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=6119 分析: 我们一看到这题呢,因为题目明确告诉我们有重叠,所以我们肯定要先排序预处理下啦,然后呢, ...
- [水]2015百度之星初赛第一场 超级赛亚ACMer
Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度. 所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升. 具 ...
- 2015 百度之星 初赛1 1001(贪心)
Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度. 所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发 ...
- 2016百度之星 - 初赛(Astar Round2B)解题报告
此文章可以使用目录功能哟↑(点击上方[+]) 被自己蠢哭,去年还能进一下复赛,今年复赛都没戏了... 链接→2016"百度之星" - 初赛(Astar Round2B) Prob ...
- 2016百度之星 - 初赛(Astar Round2A)解题报告
此文章可以使用目录功能哟↑(点击上方[+]) 有点智商捉急,第一题卡了好久,看来不服老,不服笨是不行的了...以下是本人目前的题解,有什么疑问欢迎提出 链接→2016"百度之星" ...
- 2021百度之星初赛第一场部分题解
写在前面 几个家长要求我写一些2021百度之星初赛第一场的题解. 1003 鸽子 原题链接 https://acm.hdu.edu.cn/showproblem.php?pid=6998 http:/ ...
- 字符串处理 2015百度之星资格赛 1002 列变位法解密
题目传送门 1 /* 2 字符串处理:要求解码,然而二维数组开不下,可以直接输出 3 只要在余数的地方判断一下就行了,vector的效率不高 4 另外:感觉麻烦的地方应该纸上写写就清楚了 5 */ 6 ...
- 2021百度之星初赛二(1001 -- 1003)
2021百度之星初赛二(1001 – 1003) 1001 题意: 给 a,b,每次 a,b会变为 a+b,a-b,问 k 次之后变成了哪两个数,对 998244353998244353 取模,多组数 ...
最新文章
- solaris 中挂载usb移动硬盘
- .NET Core 3.0 特性初探:C# 8、WPF、Windows Forms、EF Core
- 深度学习(三)之LSTM写诗
- Java实训项目5:GUI学生信息管理系统 - 实现步骤 - 创建数据库与表
- VS 2013 Chrome PPAPI 开发环境
- 零基础入门语义分割——Task1 赛题理解
- sum problem
- 服务器硬盘一直亮红灯怎么回事,请问:电脑的硬盘为何一直亮着红灯?且硬盘很 – 手机爱问...
- 本特利177230-00-01-CN
- 人工晶状体在线公式A常数优化——多线程
- 付永刚计算机信息安全技术课后答案
- 2022.11.2 英语背诵
- mp4视频文件损坏的修复方法
- 计算机安全的基本要求是什恶魔,公考面试真题:2018年3月17日银监会(计算机岗)面试真题1...
- linux 输出到文件 新,如何将Linux命令输出保存到文件的两种方法
- 快速搞明白公网和私网的区别(组建私网的网络号)
- 切换上下首音乐功能的实现(消息订阅与发布的使用)
- linux字体配置要略,Linux字体配置要略.pdf
- 杰理之KeyPage【篇】
- MySQL数据库的四种登录方式