zoukankan      html  css  js  c++  java
  • 10.25模拟 三角形

    1. 三角形
    (trokuti.cpp/c/pas)
    ? 【 问题描述 】
    ? 平面上有N条直线,用方程A i x + B i y +C i
    =0表示。这些直线没有三线共点的。现在
    要你计算出用这些直线可以构造出多少三
    角形?
    【 输入格式 】
    ? 第1行:一个整数N(1 ≤ N≤ 300000)。
    ? 下面N行:每行3个整数:Ai, Bi 和Ci,
    表示对应直线方程的系数。不超过10^9.
    【 输出格式 】
    一行,一个整数。
    input 1
    6
    0 1 0
    -5 3 0
    -5 -2 25
    0 1 -3
    0 1 -2
    -4 -5 29
    input 2
    5
    -5 3 0
    -5 -3 -30
    0 1 0
    3 7 35
    1 -2 -1
    output 1
    10
    output 2
    10
    【 数据规模与约定 】
    ? 对于40%的数据,N ≤1000;
    ? 对于100%的数据,N≤300000。

    /*暴力乱搞 3个点15分*/
    #include<cstdio>
    #include<iostream>
    using namespace std;
    struct node
    {
        int a,b,c;
    } f[30010];
    int n,g[3010][3010],s[30010]={0};
    long long ans=0;
    int main()
    {
    //    freopen("trokuti.in","r",stdin);
    //    freopen("trokuti.out","w",stdout);
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
            scanf("%d%d%d",&f[i].a,&f[i].b,&f[i].c);
        for (int i=1;i<=n-1;i++)
            for (int j=i+1;j<=n;j++)
                if ((f[i].a*f[j].b-f[i].b*f[j].a)!=0) 
                {
                    s[i]++;
                    g[i][s[i]]=j;
                }
        int x,y;
        for (int i=1;i<n;i++)
            for (int j=1;j<=s[i];j++)
            {
                x=g[i][j];
                y=s[x];
                for (int k=1;k<=y;k++)
                {
                       int t=g[x][k];
                       if ((f[i].a*f[t].b-f[i].b*f[t].a)!=0 && (f[x].a*f[t].b-f[x].b*f[t].b)!=0)
                        ans++; 
                }
            }
        //printf("%I64d",ans);  
        cout<<ans;
    //    fclose(stdin);
    //    fclose(stdout);
        return 0;                                                      
    }
    /*正解:先计算斜率 再排序3个不同斜率的直线可构成三角形 当有两条斜率相同 或 三条斜率都相同时不行 所以要排除这两种可能 运用数论组合排列*/
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #define N 300010
    using namespace std;
    double k[N],a[N],b[N],c[N];
    long long n,cnt,len[N];
    long long C(long long x,long long num)
    {
        if (num==2)
            return x*(x-1)/2;
        if (num==3)
            return x*(x-1)*(x-2)/6;
    }
    int main()
    {
        //freopen("trokuti.in","r",stdin);
        //freopen("trokuti.out","w",stdout);
        cin>>n;
        for (long long i=1;i<=n;i++)
        {
            scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
            k[i]=-a[i]/b[i];
        }
        sort(k+1,k+n+1);
        len[++cnt]=1;
        double now=k[1];
        for (long long i=2;i<=n;i++)
            if (k[i]!=now)
            {
                len[++cnt]=1;
                now=k[i];
            }
            else 
                  len[cnt]++;
        long long ans=C(n,3);
        for (long long i=1;i<=cnt;i++)
        {
            if (len[i]>=2)
                ans-=C(len[i],2)*(n-len[i]);
            if (len[i]>=3)
                ans-=C(len[i],3);
        }
        cout<<ans;
        //fcolse(stdin);
        //fclose(stdout);
        return 0; 
    }
  • 相关阅读:
    集合
    Java异常处理机制
    LEACH分簇算法实现和能量控制算法实现
    利用MATLAB仿真最小发射功率下WSN的连通性和覆盖率
    利用MATLAB仿真节点个数和节点通信半径与网络连通率的关系
    STM32液晶显示HT1621驱动原理及程序代码
    LMC7660即-5V产生电路
    LM431精密+3.3V产生电路
    锂电池充电电路、锂电池充电保护电路
    AMS1117降压电路
  • 原文地址:https://www.cnblogs.com/xiaoqi7/p/5997868.html
Copyright © 2011-2022 走看看