UVALive - 7461 Separating Pebbles 凸包+线段相交

本文介绍了一个算法问题的解决方法,该方法通过计算几何中的凸包算法来判断两个点集是否存在交集,并利用线段相交判断进一步确认是否发生交叉。使用Graham扫描算法找出点集的凸包,再检查凸包内的线段是否有交点。

整体思路 :判凸包,然后在判断线段相交

先跑整个图的 凸包,是为了判断包含的情况

板子题


#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const double eps=1e-10;
const int maxn=300;
struct point {
    double x,y;
    int id;
}pnt[maxn],pnt1[maxn],pnt2[maxn],res1[maxn],res2[maxn];
bool mult(point sp,point ep,point op) {
    return (sp.x-op.x)*(ep.y-op.y)>=(ep.x-op.x)*(sp.y-op.y);
}
bool operator <(const point &l,const point &r) {
    return l.y<r.y||(l.y==r.y&&l.x<r.x);
}
int graham(point pnt[],int n,point res[]) {
    int len,k=0,top=1;
    memset(res,0,sizeof res);
    sort(pnt,pnt+n);
    if(n==0) return 0;res[0]=pnt[0];
    if(n==1) return 1;res[1]=pnt[1];
    if(n==2) return 2;res[2]=pnt[2];
    for(int i=2; i<n; i++) {
        while(top&&mult(pnt[i],res[top],res[top-1])) top--;
        res[++top]=pnt[i];
    }
    len=top;res[++top]=pnt[n-2];
    for(int i=n-3; i>=0; i--) {
        while(top!=len&&mult(pnt[i],res[top],res[top-1])) top--;
        res[++top]=pnt[i];
    }
    return top;
}
bool inter(point a,point b,point c,point d)
{
    if(min(a.x,b.x)>max(c.x,d.x)||
       min(a.y,b.y)>max(c.y,d.y)||
       min(c.x,d.x)>max(a.x,b.x)||
       min(c.y,d.y)>max(a.y,b.y)) return 0;
    double h,i,j,k;
    h=(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
    i=(b.x-a.x)*(d.y-a.y)-(b.y-a.y)*(d.x-a.x);
    j=(d.x-c.x)*(a.y-c.y)-(d.y-c.y)*(a.x-c.x);
    k=(d.x-c.x)*(b.y-c.y)-(d.y-c.y)*(b.x-c.x);
    return h*i<=eps&&j*k<=eps;
}
int main() {
    int t,n,id;
    double x,y;
    cin>>t;
    while(t--){
        cin>>n;
        memset(pnt,0,sizeof pnt);
        int n1=0,n2=0;
        for(int i=0;i<n;i++){
            cin>>x>>y>>id;
            pnt[i].x=x;pnt[i].y=y;pnt[i].id=id;
            if(id==0){
                pnt1[n1].x=x;pnt1[n1].y=y;pnt1[n1++].id=id;
            }
            else{
                pnt2[n2].x=x;pnt2[n2].y=y;pnt2[n2++].id=id;
            }
        }
        if(n==1||n==2){
            cout<<1<<endl;continue;
        }
        if(n1==n||n2==n){cout<<1<<endl;continue;}
        int m=graham(pnt,n,res1);
        int cnt=0;
        for(int i=0;i<m;i++) if(res1[i].id==1) cnt++;
        if(cnt==0||cnt==m){cout<<0<<endl;continue;}
        int m1=graham(pnt1,n1,res1);
        int m2=graham(pnt2,n2,res2);
        int flag=0;
        for(int i=0;i<=m1-1;i++){
            point a=res1[i],b;
            if(i==m1-1) b=res1[0];
            else b=res1[i+1];
            for(int j=0;j<=m2-1;j++){
                point c=res2[j],d;
                if(j==m2-1) d=res2[0];
                else d=res2[j+1];
            if(inter(a,b,c,d)){flag=1;break;}
            }
            if(flag) break;
        }
        if(flag) cout<<0<<endl;
        else cout<<1<<endl;
    }
    return 0;
}


内容概要:本文研究了计及碳排放的多微网电能交互分布式运行策略,提出了一种基于交替方向乘子法(ADMM)的优化方法,旨在实现多微电网系统在满足能源供需平衡的同时降低碳排放。文中构建了包含分布式电源、储能系统、可控负荷及碳排放约束的多微网协同优化模型,通过ADMM算法将全局优化问题分解为各微网子系统独立求解的子问题,实现分布式协同调度,在保障各微网自治性的同时兼顾系统整体的经济性与低碳性。研究通过Matlab代码完成了算法仿真,验证了所提策略在提升能源利用效率、减少碳排放、增强系统鲁棒性与可扩展性方面的有效性,为低碳化、去中心化的能源互联网运行提供了理论支持与实践参考。; 适合人群:具备电力系统分析、优化理论及Matlab编程基础的科研人员、电气工程及相关专业的研究生,以及从事智慧能源、分布式能源系统规划与运行的工程技术人员。; 使用场景及目标:①应用于多微电网系统的分布式能量管理与协同优化调度;②支持“双碳”目标下的低碳电网运行策略设计与政策评估;③为ADMM等分布式优化算法在能源系统中的工程化应用提供完整的模型构建、算法实现与仿真验证案例。; 阅读建议:读者应结合Matlab代码深入理解ADMM算法的迭代流程、拉格朗日函数构造与收敛条件设定,重关注模型中碳排放因子的引入方式、变量分解机制与子问题求解过程,建议通过调整微网数量、碳价参数及通信拓扑结构进行多场景仿真,以深化对分布式协同机制与环保经济权衡关系的理解。
下载代码方式:https://pan.quark.cn/s/cc130f55eddd BUCK变换器,亦称为降压型转换器,在开关电源技术中属于一种基础电路拓扑,其核心功能在于实现从高电压到低电压的转换,并且在转换过程中确保输出端电压的稳定性。本文的核心内容集中在对BUCK变换器的运行机制进行剖析、阐释电流连续模式(CCM)与断续模式(DCM)之间的差异,并深入探讨这两种模式在稳态下的相互关系,同时研究BUCK变换器的交流等效电路模型以及电压与电流补偿回路的构建方法。BUCK变换器的原理示意图如图1所示,其显著特征在于输出电压值低于输入电压值,输出电流保持连续状态,而输入电流则呈现出脉动特性。变换器的工作过程可以划分为两个主要阶段:在第一个阶段,即开关管导通期间,电感元件负责储存能量,电流呈现出线性增长的趋势,并且同时向负载提供能量;在第二个阶段,即开关管截止期间,电感通过二极管实现能量的续流,电流则表现出线性递减的态势。依据电感元件的伏秒平衡原理,可以推导出涉及开关管占空比、电感元件电感量、输入电压以及输出电压之间关系的数学公式,这些公式对于深入理解和设计BUCK变换器具有关键性的指导意义。 接下来,文章对CCM和DCM两种模式进行了详细的比较分析。在CCM模式下,电感电流在整个开关周期内均保持连续的状态,而在DCM模式下,电感电流则会出现中断现象。确定BUCK变换器工作模式的关键依据是其电感电流纹波值与输出电流值相等这一边界条件。当电流纹波值等于零,即在整个开关周期内电感电流保持完全连续时,BUCK变换器被归类为CCM模式;相对地,若电流纹波值大于零,则表明变换器处于DCM模式;介于两者之间的情况则界定为CCM与DCM的过渡状态。 在DCM模式下,对BUCK...
源码链接: https://pan.quark.cn/s/ae09e867d64c S参数指的是散射参数,其英文全称为“Scattering-Parameter”。该参数用于表征电路网络中信号传输与反射的特性,是微波领域中衡量电路网络性能的核心指标。以二端口网络为例,比如单根传输线,其包含四个S参数,分别为S11、S12、S21和S22。其中,S11代表端口1的反射系数,S12代表端口1至端口2的反向传输系数,S21代表端口2至端口1的正向传输系数,而S22则表示端口2的反射系数。在高速电路设计领域,S参数是评估电路网络性能的关键依据。对于互易性网络,存在S12=S21的关系;对于对称性网络,满足S11=S22的条件;而对于无耗性网络,则有S11*S11+S21*S21=1,即网络不产生能量损耗,从端口1输入的能量要么被反射回端口1,要么被传输至端口2。在实际应用场景中,S参数能够用于评估电路网络的性能表现,例如,S11体现回波损耗,即有多少能量被反射回源端(Port1),该值越小越好,通常推荐S11<0.1,即-20dB。S21则反映插入损耗,即有多少能量被传输到目的端(Port2),该值越大越优,理想值为1,即0dB,传输效率越高,一般建议S21>0.7,即-3dB。此外,S参数还可用于判断电路网络的互易性与对称性。在高速电路设计过程中,这些参数具有显著意义,因为它们对电路网络的性能和稳定性具有直接影响。S参数是评估电路网络性能的核心指标,能够衡量电路网络的信号传输和反射能力,对于高速电路设计而言至关重要。关于Z参数和Smith圆图,Z参数属于阻抗参数,而Smith圆图是反射系数(以符号Γ表示)的极坐标图形。Smith圆图可用于评估电路网络的阻抗匹配状况...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值