平台

发布于 2019-04-18  850 次阅读


题目描述

为了进行一种游戏,现决定搭造一些平板,而各个平板的地址已经选定。基于最普遍的认识,没有任何支持物的平板不可能漂浮在空中。说的更精确些,任意一平板的两端必需有支柱或者它在另一块平板上。
你会得到各个平板在坐标系中的坐标(如左下图)。每一块平板的坐标都是由它的高度(与地板间的垂直距离)和它的水平方位(开始和结束)决定的。每个支柱都距它支撑的平板的边缘半个单位(如右下图)。
算出支持所有平板的支柱的总长度。
这里写图片描述

输入

输入文件platforme.in第一行包括1个整数N,1 ≤ N ≤ 100,即平板的总数。
接下来的N行每行都是一块平板的坐标,是相应的Y,X1和 X2。即高度和水平的边缘坐标。所有的数都是不大于10000的正整数且满足X2 > X1+1(也可这样理解,每一块平板的长度至少为2)。
输入保证任意两块平板间没有重叠部分。

3
1 5 10
3 1 5
5 3 7

输出

输出文件platforme.out要撑起所有平板所需的支柱的总长度。

14

思路

我是将全部数在一个很大的数组里面表示出来,然后模拟一下
这题要注意是根据线来分线段而不是格子

#include 
using namespace std;
int f[20001][10001];
int a[10001][4];
int main()
{
    int n;
    scanf("%d",&n);

    for (int i=1;i<=n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]);
        a[i][3]--;
        for (int j=a[i][2];j<=a[i][3];j++)
            f[a[i][1]][j]=1;
    }

    int ans=0;
    for (int i=1;i<=n;i++)
    {
        int j=a[i][1]-1,x=a[i][2];
        while (f[j][x]!=1&&j>0)
        {
            ans++;
            j--;
        }
        ans++;
        x=a[i][3];
        j=a[i][1]-1;
        while (f[j][x]!=1&&j>0)
        {
            ans++;
            j--;
        }
        ans++;
    }
    printf("%d\n",ans);
}
]]>