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