交叉线

交叉线

http://www.nowcoder.com/questionTerminal/54fe00d9b0e14688bd3d31ad539b929c

题解:

考察点: 思维,数形结合,暴力

易错点:

本题中要求的是相交的半圆,如果存在两个半圆,直径分别为,并且满足,则不属于相交的情况,所以如果按照结束位置排序的方法来贪心并不可行

一定注意题目中明确说明在端点处相交不算相交

解法:

这题通过数形结合的方法更容易理解,设两个半圆的端点分别为,则相交时有如下图所示的情况:

图片说明

在有了上述结论后,题目就变得简单,直接对于半圆,直接枚举其前面位置的半圆,看和其是否存在交点,复杂度为

#include "bits/stdc++.h"
using namespace std;
const int maxn=1e3+10;
int T,n;
int a[maxn];
struct node{
    int l,r;
}p[maxn];
int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        memset(a,0,sizeof(a));
        memset(p,0,sizeof(p));
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=2;i<=n;i++){
            p[i-1].l=min(a[i-1],a[i]);
            p[i-1].r=max(a[i-1],a[i]);
        }
        --n;
        int flag=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<i;j++){
                if((p[j].l<p[i].r&&p[j].l>p[i].l&&p[j].r>p[i].r)||(p[j].r<p[i].r&&p[j].r>p[i].l&&p[j].l<p[i].l)){
                    flag=1; 
                    break;
                }
            }
            if(flag) break;
        }
        if(!flag) printf("n\n");
        else printf("y\n");
    }
    return 0;
}
全部评论

相关推荐

3 1 评论
分享
牛客网
牛客企业服务