Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

温馨提示:从一个板子到另一个板子的时候,中间的板子不能直接穿过!!

Posted by 1173769234 at 2020-01-27 10:52:55 on Problem 1661
AC代码:
```cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1005;
const int INF = 0x3f3f3f3f;
struct p
{
	//左右端点,高度
	int l, r, h;
	bool operator<(const p& rhs)const
	{
		if (h != rhs.h)
			return h > rhs.h;
		else
			return l < rhs.l;
	}
}p[N];

int f[N][2];

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		memset(f, 0x3f, sizeof f);

		int n, x, y, MAX;

		cin >> n >> x >> y >> MAX;

		p[0].l = x, p[0].r = x, p[0].h = y;

		for (int i = 1; i <= n; ++i)
			cin >> p[i].l >> p[i].r >> p[i].h;

		//平台高度从大到小排序
		sort(p + 1, p + n + 1);

		f[0][0] = f[0][1] = 0;

		//从前面的板子到达k号板子左右端的最短时间
		for (int k = 1; k <= n; ++k)
		{
			for (int i = 0; i < k; ++i)
			{			
				if (MAX >= p[i].h - p[k].h)
				{
					for (int j = i + 1; j <= k - 1; ++j)
					{
						if (p[i].l >= p[j].l && p[i].l <= p[j].r)
							goto here1;
					}
					if (p[i].l >= p[k].l && p[i].l <= p[k].r)
					{
						f[k][0] = min(f[k][0], f[i][0] + p[i].h - p[k].h + p[i].l - p[k].l);
						f[k][1] = min(f[k][1], f[i][0] + p[i].h - p[k].h + p[k].r - p[i].l);
					}
				here1:;
					for (int j = i + 1; j <= k - 1; ++j)
					{
						if (p[i].r >= p[j].l && p[i].r <= p[j].r)
							goto here2;
					}
					if (p[i].r >= p[k].l && p[i].r <= p[k].r)
					{
						f[k][0] = min(f[k][0], f[i][1] + p[i].h - p[k].h + p[i].r - p[k].l);
						f[k][1] = min(f[k][1], f[i][1] + p[i].h - p[k].h + p[k].r - p[i].r);
					}
				here2:;
				}
			}
		}

		int res = INF;

		//达到地面
		for (int i = 0; i <= n; ++i)
		{
			bool flag1 = false, flag2 = false;
			for (int j = i + 1; j <= n; ++j)
			{
				if (!(p[i].l < p[j].l || p[i].l > p[i].r))
					flag1 = true;
				if (!(p[i].r < p[j].l || p[i].r > p[j].r))
					flag2 = true;
			}
			if (!flag1 && p[i].h <= MAX)
				res = min(res, f[i][0] + p[i].h);
			if (!flag2 && p[i].h <= MAX)
				res = min(res, f[i][1] + p[i].h);
		}
		cout << res << endl;
	}



	return 0;
}
```

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator