【BZOJ1007】【HNOI2008】水平可见直线
来源:互联网 发布:c语言源代码大全 编辑:程序博客网 时间:2024/05/22 06:47
Description
在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=-x; L3:y=0则L1和L2是可见的,L3是被覆盖的.给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线.
Input
第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi
Output
从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必须有个空格
Sample Input
3
-1 0
1 0
0 0
-1 0
1 0
0 0
Sample Output
1 2
题解
贪心题。。
先按k升序排序相等按b排,发现如果一条直线要盖到上一条直线需要满足这条直线与上两条直线的焦点比上一条和上两条直线的焦点靠左。用栈维护一下,因为要从小到大输出编号,所以用栈维护编号。
#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<stack>using namespace std;const int maxn=100010;int s[maxn];bool ans[maxn];struct node{double a,b;int id;}l[maxn];int cmp(node a,node b){if(a.a==b.a)return a.b>b.b;return a.a<b.a;}double work(node a,node b){return (b.b-a.b)/(a.a-b.a);}int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf%lf",&l[i].a,&l[i].b);l[i].id=i;}sort(l+1,l+n+1,cmp);int top=1;s[1]=1; for(int i=2;i<=n;i++){if(l[i].a-l[i-1].a<1e-8) continue;//平行 while(top>1&&work(l[i],l[s[top]])<=work(l[s[top]],l[s[top-1]])) top--;s[++top]=i;}for(int i=1;i<=top;i++) ans[l[s[i]].id]=1;for(int i=1;i<=n;i++)if(ans[i])printf("%d ",i);return 0;}
阅读全文
0 0
- bzoj1007 [HNOI2008]水平可见直线
- BZOJ1007: [HNOI2008]水平可见直线
- BZOJ1007【HNOI2008】水平可见直线
- 【BZOJ1007】【HNOI2008】水平可见直线
- bzoj1007【hnoi2008】水平可见直线
- 【HNOI2008】【BZOJ1007】水平可见直线
- BZOJ1007 HNOI2008 水平可见直线
- bzoj1007 [HNOI2008]水平可见直线
- bzoj1007[HNOI2008]水平可见直线
- bzoj1007: [HNOI2008]水平可见直线
- BZOJ1007: [HNOI2008]水平可见直线
- bzoj1007 [HNOI2008]水平可见直线
- bzoj1007: [HNOI2008]水平可见直线
- bzoj1007 [HNOI2008]水平可见直线
- bzoj1007[HNOI2008]水平可见直线
- 【HNOI2008】bzoj1007 水平可见直线
- 【BZOJ1007】【HNOI2008】水平可见直线
- BZOJ1007 [HNOI2008]水平可见直线
- 贪心算法
- tensorflow 变量的创建、初始化、执行和输出
- 人脸识别系列-Centerloss论文阅读笔记
- 个人简历APP cocos制作
- js实现常见排序方法
- 【BZOJ1007】【HNOI2008】水平可见直线
- 【s5p4418嵌入式学习】分步编译之module编译05
- 8章 进程控制
- 大数据排重算法-布隆算法(BloomFilter)
- 微信小程序--后端管理平台业务4--Mybatis模糊查询相关
- 排序算法之归并排序
- 数据结构-数组
- 机器学习故事汇-决策树算法
- scala实现超限学习机(ELM)手写数字分类