BUPTOJ85 Three Points On A Line

考研党200年没码过代码了,没想到一上手这么生,还是和ACM大牛们没法比啊╮(╯▽╰)╭但好歹也是技术流,码代码还算有点自信。。。为了准备复试,抱着把北邮OJ上所有题刷一遍的心情就去了。。

PS:居然在论坛听说,有考研400分的大神,不、会、写、代、码!!

BUPT83 A+B 无压力秒杀!!!First Blood!!

BUPT84 Single Number 本来以为能轻松Double Kill的。。没想到跪在超时上了,到现在还没想明白

BUPT85 Three Points On A Line 没想到连跪两题,有辱ACM业余队员称号(低调低调) =  =

BUPT86...

不行!!必须把BUPT85做出来!!决不能再这样水下去了!!!我是要成为大牛的男人!!于是——

**********************************

上面不是分割线,是我说的话。解决了看错题、拼写错误等低端失误之后,还是答案错误。最后,我只好百度了。。。看到了一大牛写的解答。。暴力归暴力,我终于知道自己哪错了。

http://blog.csdn.net/birdstorm_s/article/details/21017411

之所以称之为大牛,是因为大牛总是在字里行间体现水平。他说有O(n^2)的算法,这个可是我百度好久之后才找到的,3SUM Hard问题。。

http://cs.smith.edu/~orourke/TOPP/P11.html#Problem.11

我确定我这不是算法问题,我怀疑是float的精度问题。。。

我判断三点共线用的斜率,但斜率就要除法,两个三位小数精度的数除完之后的精度是什么来着?好像物理实验课讲过。。可惜已经忘了。。我试了10^-4、10^-5,都报错。

大牛的判断方法把斜率相等的公式推导了一下,变成了一个乘法和减法的算式。这个好,不仅效率比除法高,而且精度易计算,10^-6。

判断方法改后,直接通过了。。仅以此文记这艰难的AC,展望更加艰难的未来╮(╯▽╰)╭

/*
USER_ID: test#aa3615058
PROBLEM: 85
SUBMISSION_TIME: 2014-03-17 23:06:13
*/
#include <iostream>
#include <math.h>
using namespace std;
 
typedef struct Point{
    float x;
    float y;
}Point;
 
bool isOnALine(Point a, Point b, Point c);
float slope(Point a, Point b);
 
int main() {
    int caseCount;
    bool onaline;
    cin>>caseCount;
    for(int i = 0; i < caseCount; i++) {
        int pointCount;
        cin>>pointCount;
 
        Point ps[pointCount];
        for(int j = 0; j < pointCount; j++) {
            cin >> ps[j].x >> ps[j].y;
        }
        onaline = false;
        if(pointCount >= 3) {
            Point a,b,c;
            for(int k = 0; k < pointCount && !onaline; k++) {
                a = ps[k];
                for(int l = k + 1; l < pointCount && !onaline; l++) {
                    b = ps[l];
                    for(int g = l + 1; g < pointCount && !onaline; g++) {
                        c = ps[g];
                        if(isOnALine(a,b,c)) {
                            onaline = true;
                            break;
                        }
                    }
                }
            }
        }
        if(onaline) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
 
    return 0;
}
 
bool isOnALine(Point a, Point b, Point c) {
    return (fabs(a.x * c.y + b.x * a.y + b.y * c.x - b.x * c.y - a.y * c.x - b.y * a.x) <= 1e-6);
}
 
float slope(Point a, Point b) {
    return (a.y - b.y) / (a.x - b.x);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值