uva 11529 - Strange Tax Calculation(计数问题)

题目链接:uva
11529 - Strange Tax Calculation

题目大意:给出若干个点,保证随意三点不共线。随意选三个点作为三角行,其它点若又在该三角形内,则算是该三角形内部的点。问全部情况的三角形平均每一个三角形有多少个内部点。

解题思路:三角形的总数非常easy求C(3n),如今就是要求各个三角形内部点的总数。相同我们能够反过来,求每一个点在多少个三角形的内部。

然后我们确定一个点,求该点在多少个三角的内部。剩余n-1个点。能够组成C(3n?1])个三角形,所以仅仅要求出该点在哪些三角形的外部就可以。

红色点为选中的点,将周围点依照与选中点的极角进行排序,每次枚举一点,它的极角为a。全部极角小于a+pi的点。这些点组成的三角形。选中点一定在外部。处理一周的方式是将点的数组扩大两倍,将全部点的极角加上pi有保留在延长的数组中。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
const int N = 1205;
const double pi = 4 * atan(1.0);
const double eps = 1e-9;

int n;
double s, r[2*N];
struct point {
    double x, y;
}p[N];

double Count (int d) {
    int c = 0, mv = 0;
    for (int i = 0; i < n; i++) {
        if (i == d)
            continue;

        double a = atan2(p[i].y-p[d].y, p[i].x-p[d].x);
        r[c] = a;
        r[c+n-1] = a + 2*pi;
        c++;
    }

    c = 2 * n - 2;
    sort(r, r + c);

    double ans = 0;

    for (int i = 0; i < n-1; i++) {
        double tmp = r[i] + pi;

        while (tmp > r[mv])
            mv++;
        double cnt = mv - i - 1;
        ans = ans + cnt * (cnt-1) / 2;
    }
    return s - ans;
}

double solve () {
    s = (n-1) * (n-2) * (n-3) / 6.0;
    double c = n * (n-1) * (n-2) / 6.0;
    double ans = 0;

    for (int i = 0; i < n; i++)
        ans += Count(i);

    return ans / c;
}

int main () {
    int cas = 1;
    while (scanf("%d", &n) == 1 && n) {
        for (int i = 0; i < n; i++)
            scanf("%lf%lf", &p[i].x, &p[i].y);
        printf("City %d: %.2lf\n", cas++, solve());
    }
    return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-08-27 14:47:16

uva 11529 - Strange Tax Calculation(计数问题)的相关文章

UVA 11529 - Strange Tax Calculation(计数问题)

题目链接:11529 - Strange Tax Calculation 题意:平面上n个建筑物,3个建筑物可以组成一个三角形,计算平均每个三角形内有多少个点 思路:问题等价于,求凹四边形的占所有四边形的比例,用O(n^2)的算法,跟 HDU 3629 Convex 这题是一个道理 代码: #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using n

UVA - 11529 Strange Tax Calculation

The people living in large citieshave to pay more tax than people living in rural areas. That is because incities people have many facilities, which rural people don't have. Also peoplein large and famous cities tend to pay more tax than people livin

UVA 1362 - Exploring Pyramids(计数问题+区间DP)

题目链接:1362 - Exploring Pyramids 白书上的例题,思路是对于每个结点,往后遍历分为左右两边子树来考虑,左边的子树为去掉根节点剩下的子树,而右边是要算上根节点的,这样就不会有重复的情况出现,然后根据乘法原理,左右两边情况相乘为总情况数,然后计算这些总和. f[i][j]表示[i,j]结点的情况种数,那么 f[i][j] = sum{f[i + 1][k - 1] * f[k][j]},并且s[i] == s[k] == s[j],因为i, j, k表示的是根节点必须相同.

UVA 11538 - Chess Queen(数论+计数问题)

题目链接:11538 - Chess Queen 题意:给一个n*m棋盘,问放两个皇后,使得两个皇后互相能攻击到,有几种放法 思路:分横竖,对角线来考虑. 横:n * A(m, 2)种 竖:m * A(n, 2)种 对角线:由于有两条,可以算一条再乘2 2 * 所有对角线和(A(对角线格数,2)). 那么对角线格数为:(1, 2, 3, 4 ... n .n .n .n.n - 1. .. 4. 3 .2. 1) 然后为n的有m - n + 1条(m >= n) 所以答案为:2*(2*∑i*(i

《算法竞赛入门经典——训练指南》第二章题库

UVa特别题库 UVa网站专门为本书设立的分类题库配合,方便读者提交: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=442 注意,下面注有"extra"的习题并没有在书中出现,但在上面的特别题库中有,属于附加习题. 基础练习 (Basic Problems) UVa11388 GCD LCM UVa11889 Benefit UVa10943 How do y

UVA 12123 - Magnetic Train Tracks(计数问题)

题目链接:12123 - Magnetic Train Tracks 题意:给定n个点,求有几个锐角三角形. 思路:和UVA 11529是同类的题,枚举一个做原点,然后剩下点根据这个原点进行极角排序,然后利用two pointer去遍历一遍,找出角度小于90度的锐角,然后扣掉这些得到钝角三角形的个数,然后在用总情况去扣掉钝角就是锐角或直角 代码: #include <stdio.h> #include <string.h> #include <math.h> #incl

解决Tax discount configure 报出异常

If your tax calculation is based on a problematic configuration, the following warnings appear: Warning. Tax discount configuration might result in different discounts than a customer might expect for store(s); Europe Website (French), Europe Website

CN00 与CN28 区别

做过SAP HR的大都知道,SAP在中国区提供的Payroll schema有两个,一个是CN00,一个是CN28.两者最大的区别是,一个是把计税的结果带到当月,另外一个是把税基带到当月. 我现在碰到了一个客户,它的需求是,如果上月员工有发薪水(存在Payroll result),那么就把税基带到本月,如果上月员工薪水就没有发,那么就把税的结果带到本月: 于是我便仔细研究这两个schema的差别的出结果如下 首先来看看SAP标准的schema处理两种算税模式时候的差别: 1.         C

uva 11038 - How Many O&#39;s?(计数问题)

题目链接:uva 11038 - How Many O's? 题目大意:写出m到n之间的数,问需要写多少个0. 解题思路:f(x)表示从0到x需要写多少个0,于是给出区间[m,n]就有答案等于f(n)-f(m-1).剩下的就是f(x)该如何求.枚举每个位置上可能为0的情况,这样就将这个数分成两个部分,在保证组成的数小于x的前提下,计算可以的组成方法. 例:x=12345,枚举十位为0的情况,因为x的十位为4,所以十位以前的百位.千位.万位组成的数可以是0~123,然后个位可以是0~9,这样组成的