pku 2653 Pick-up sticks

本文详细介绍了在ACM竞赛中遇到Pku平台因越界判断导致时间限制错误(TLE)的问题,并通过具体代码实现解决方法。包括越界检查的正确方式、模板优化及案例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.pku.edu.cn/JudgeOnline/problem?id=2653

我明明越界,pku 给tle... 害的我一顿改。就是不过。还以为模板有问题

#include <stdio.h>
#define FOR(i,s,e) for (int (i)=(s); (i) < (e);i++)
inline double max(double a, double b) {return a > b ? a : b;}
inline double min(double a, double b) {return a < b ? a : b;}
struct POINT
{
double x;
double y;
POINT(double a=0, double b=0) { x=a; y=b;} //constructor
};
struct LINESEG
{
POINT s;
POINT e;
LINESEG(POINT a, POINT b) { s=a; e=b;}
LINESEG() { }
};
struct NODE
{
    LINESEG line;
    int num;
};
const double INF = 1E20;
const double EP = 1E-9;
const int MAXV = 300;
const double PI = 3.14159265;
inline double multiply(POINT sp, POINT ep, POINT op)
{
    return ((sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y) );
}
bool intersect(LINESEG u,LINESEG v)
{
    return (max(u.s.x,u.e.x) >= min (v.s.x,v.e.x)) &&
         (max(v.s.x,v.e.x) >= min(u.s.x,u.e.x)) &&
         (max(u.s.y,u.e.y) >= min(v.s.y,v.e.y )) &&
         (max(v.s.y,v.e.y) >= min(u.s.y,u.e.y)) &&
         (multiply(v.s,u.e,u.s) * multiply(u.e,v.e,u.s) >=0) &&
         (multiply(u.s,v.e,v.s) * multiply(v.e,u.e,v.s) >=0 );
}
LINESEG line[100010];
int n;
int main()
{
//    freopen("in.txt","r",stdin);
    int n;
    while (scanf("%d",&n)&n>0)
    {
        int sum = 0;
        FOR(i,0,n)
         scanf("%lf%lf%lf%lf",&line[i].s.x, &line[i].s.y, &line[i].e.x, &line[i].e.y);
        if(n<=1)
        {
            puts("Top sticks: 1");
            continue;
        }
        printf("Top sticks:");
        FOR(i,0,n-1)
        {
            bool sign = false;
            FOR(j,i+1,n)
            if (intersect(line[i],line[j]))
            {sign=true;break;}
            if (!sign)
            printf(" %d,",i+1);
        }
        printf(" %d.\n",n);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值