前言
水题不想说,连自带快排都懒得用了
正题
有n个平台,每个平台头尾有两根柱子支撑到地板或另一个平台上,求支撑平台需要的柱子数
输入输出(需要自取)
Input
输入文件platforme.in第一行包括1个整数N,1 ≤ N ≤ 100,即平板的总数。
接下来的N行每行都是一块平板的坐标,是相应的Y,X1和 X2。即高度和水平的边缘坐标。所有的数都是不大于10000的正整数且满足X2 > X1+1(也可这样理解,每一块平板的长度至少为2)。
输入保证任意两块平板间没有重叠部分。
Output
输出文件platforme.out要撑起所有平板所需的支柱的总长度。
Sample Input
3
1 5 10
3 1 5
5 3 7
Sample Output
14
解题思路
排一下高度,然后用数组表示每个x坐标处最高的平台。然后每次更新
代码
#include<cstdio>
#include<algorithm>
using namespace std;
struct wood{
int h,x1,x2;
}a[101];
int sum,n,hi[10001];
int main()
{
//freopen("platforme.in","r",stdin);
//freopen("platforme.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].h,&a[i].x1,&a[i].x2);
a[i].x2-=1;
}
for (int i=1;i<n;i++)
for (int j=i+1;j<=n;j++)
{
if (a[i].h>a[j].h) swap(a[i],a[j]);
}//冒泡
for (int i=1;i<=n;i++)
{
sum+=a[i].h-hi[a[i].x1];
sum+=a[i].h-hi[a[i].x2];//计算两根柱子
for (int j=a[i].x1;j<=a[i].x2;j++) hi[j]=a[i].h;//更新
}
printf("%d",sum);//输出
return 0;
}