线段相交进化版
description |
欧巴马有n根长度不同的木棒,他喜欢把这些木棒任意的丢在地板上来玩耍。因为木棒都是随意丢在地板上的,难免会些木棒相交, 对于那些相交的木棒,他们就有了上下之分,后来丢出的木棒当然在之前丢出木棒的上方,你的任务就是,找出这些位于最上方的木棒, 所谓在最上方,就是某跟木棒上方没有其他的木棒,当然,一根单独的木棒是符合“最上方”的标准的,因为它上方确实没有其他的木棒。 |
input |
|
output |
|
sample_input |
|
sample_output
此题在线段相交基础上还得去判断谁在最上面,这里我解题的思想用到了dp,而且其实dp这种思想若是理解了在去解题会发现其实很容易哒!下面附上代码仅供参考:#include <iostream> #include<stdio.h> #include<cmath> using namespace std; typedef struct node { double x,y; }Point; typedef struct line { Point start,end; }vector; double mul(Point p1,Point p2,Point p0) { return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); } bool cross(vector v1,vector v2) { if(max(v1.start.x,v1.end.x)>=min(v2.start.x,v2.end.x)&& max(v2.start.x,v2.end.x)>=min(v1.start.x,v1.end.x)&& max(v1.start.y,v2.end.y)>=min(v2.start.y,v2.end.y)&& max(v2.start.y,v2.end.y)>=min(v1.start.y,v1.end.y)&& mul(v2.start,v1.end,v1.start)*mul(v1.end,v2.end,v1.start)>=0&& mul(v1.start,v2.end,v2.start)*mul(v2.end,v1.end,v2.start)>=0 ) return true; return false; } int main() { int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; int f[10000]={0},b[10000]; vector a[n]; for(int i=0;i<n;i++) cin>>a[i].start.x>>a[i].start.y>>a[i].end.x>>a[i].end.y; for(int i=0;i<n;i++) { int max0=-1; for(int j=0;j<i;j++) if(cross(a[j],a[i])>0&&f[j]>max0) { f[i]=f[j]+1; max0=f[j]; } }int m=0,x=0; for(int i=0;i<n;i++) if(f[i]>m) m=f[i]; for(int i=0;i<n;i++) if(f[i]==m) { b[x]=i+1; x++; } cout<<"Top sticks:"; for(int i=0;i<x-1;i++) cout<<b[i]<<','; cout<<b[x-1]<<'.'<<endl; } return 0; } |
持续更新博客地址:
blog.csdn.net/martinue