JZOJ 3493. 【NOIP2013模拟联考13】三角形

本文介绍了一道NOIP2013模拟赛题目——通过给定点集计算能形成的三角形数量的方法。使用枚举法确定点集中的点,并通过斜率判断是否能构成三角形,特别考虑了斜率不存在的情况。
Description
平面上有n个点,求出用这些点可以构成的三角形数。
 
Input
第一行一个整数n。

接下来n行,每行两个整数,表示点的坐标。
Output
输出仅一个整数,表示所求答案。
 
Sample Input
5
0 0
1 1
1 -1
-1 -1
-1 1
Sample Output
8
 
Data Constraint
对于50%的数据,n<=300。

对于100%的数据,n<=3000,坐标的绝对值不超过10^4,保证没有重合的点。
 
做法:确定第一个点,枚举直线,判断不能形成三角形的情况,斜率不存在时要特判。
 
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 3007
using namespace std;
int n, h[N], z[N], tot, cnt, c[N * 2];
long long ans;
bool b[N];
double K[N];

int main()
{ 
//    freopen("triangle.in", "r", stdin);
//    freopen("triangle.out", "w", stdout);
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &h[i], &z[i]);
    ans = (n * (n - 1)) / 2;
    ans *= n - 2;
    ans /= 3;
    for (int i = 1; i <= n - 1; i++)
    {
        cnt = 0;
        tot = 0;
        for (int j = i + 1; j <= n; j++)
            if (h[i] == h[j])    tot++;
            else    K[++cnt] = (double)(z[i] - z[j]) / (double)(h[i] - h[j]);
        sort(K + 1, K + cnt + 1);
        ans -= (tot * (tot - 1)) / 2;
        tot = 1;
        for (int j = 2; j <= cnt; j++)
        {
            if (K[j] == K[j - 1]) tot++;
            else tot = 1;
            ans -= tot - 1;
        }
    }
    printf("%lld", ans);
    fclose(stdin);
    fclose(stdout);
}
View Code

 

转载于:https://www.cnblogs.com/traveller-ly/p/9434567.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值