测试数据:
2
3 8 7 2
6 14 6
4 10 4
5 14 2
1 6 10 20
2 3 5
结果:
结果:
17
10
代码:
Source Code
Problem: 1661 User: csjiaxin
Memory: 276K Time: 16MS
Language: C++ Result: Accepted
Source Code
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX_N (1000+1)
struct point
{
int x1;
int x2;
int h;
}P[MAX_N];
#define inf 2000000000
#define printf //
int is_between(int a,int b,int c)
{
return ( b <= a && a <= c);
}
int MAX;
int dpleft[MAX_N],dpright[MAX_N];
int get_min(int nx,int i,int h)
{
int minret = inf;
//low - > high
for(int j=i-1;j>=1;j--) //由高到底
{
int hd = h - P[j].h;
if(hd > MAX || hd <= 0)
continue;
if( is_between(nx,P[j].x1,P[j].x2))//X1[j],X2[j]))
{
if(dpleft[j] != inf)
minret = min(minret,hd + nx - P[j].x1 + dpleft[j]);
if(dpright[j] != inf)
minret = min(minret,hd + P[j].x2 - nx +dpright[j]);
printf("\n nx=%d,j=%d minret=%d\n",nx,j,minret);
return minret;
}
}
if(h <= MAX)
{
minret = h;
}
return minret;
}
int n,x,y;
int cmp(point a,point b)
{
return a.h < b.h;
}
int main()
{
int t;
cin>>t;
for(int _t=1;_t<=t;_t++)
{
cin>>n>>x>>y>>MAX;
for(int i=1;i<=n;i++)
//cin>>X1[i]>>X2[i]>>H[i];
cin>>P[i].x1>>P[i].x2>>P[i].h;
//H有低到高sort
// sort(H+1,H+n+1); //[H,H+n)
sort(P+1,P+n+1,cmp);
for(int i=1;i<=n;i++) //由低到高
{
int s = P[i].x2-P[i].x1;
dpleft[i] = get_min(P[i].x1,i,P[i].h);
dpright[i] = get_min(P[i].x2,i,P[i].h);
printf("H[%d] = %d dp(%d,%d) l(%d,%d)\n",i,P[i].h,dpleft[i],dpright[i],P[i].h,P[i].h);
}
int minp = get_min(x,n+1,y);
cout<<minp<<endl;
}
}