uva12535求圆上所有的点能形成的锐角三角形的数量


题意:给出圆上每个点的角度,然后询问这些点能形成多少个锐角三角形。


思路:反向思考,总的三角形的个数C(n,3) -- 直角三角形 - 钝角三角形 = 锐角三角形的个数


对于直角三角形和钝角三角形来求的话,就是以直角为中介,如果产生的是直角的话,那么枚举的这个点对应的那个点的连线经过圆心,也就是每次二分找到一个于180最接近的点,那么这两个点直接的所有的点都能抽出两个与枚举的那个点形成钝角或者额直角三角形。


PS:要加eps


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define clr(x,y) memset(x,y,sizeof x)
const ll Mod = 1e9 + 7;
const int maxn = 200000 + 10;
#define eps 1e-6
double a[maxn];
int finds(int l,int r,double x)
{
    int ret = 0;
    while(l <= r)
    {
        int mid = (l + r) >> 1;
        if(a[mid] <= x + eps)ret = mid,l = mid + 1;
        else r = mid - 1;
    }
    return ret;
}
int main()
{
    int n;double m;int Tcase = 1;
    while( ~ scanf("%d%lf",&n,&m))
    {
        if(n == 0 && m == 0)break;
        for(int i = 1;i <= n;i ++)scanf("%lf",&a[i]);
        sort(a + 1,a + n + 1);
        ll sum = 0;
        for(int i = 1;i <= n;i ++)
        {
            int t ;
            if(a[i] <= 180 + eps)
            {
                t = finds(i,n,180 + a[i]) - i;
            }
            else
            {
                t = finds(1,n,a[i] - 180) + n - i;
            }
//            cout << a[i] << " " << t << endl;
            sum += 1ll * t * (t - 1)/2;
        }
        printf("Case %d: %lld\n",Tcase ++,1ll *n * (n - 1)/2 *(n - 2)/3 - sum);
    }
    return 0;
}





相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页