牛客题解 | 交叉线

题目

题目链接

题解:

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

易错点:

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

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

解法:

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

图片说明

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

#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&amp;&amp;p[j].r&gt;p[i].r)||(p[j].r<p[i].r&&p[j].r>p[i].l&amp;&amp;p[j].l</p[i].r&&p[j].r></i;j++){>
posted @   wangxiaoxiao  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示