求助
查看原帖
求助
122000
Samuel_YHL楼主2021/1/18 21:32
#include <cstdio>
#include <cstring>
#include <algorithm>
#define File(_) freopen(#_".in", "r", stdin);freopen(#_".out", "w", stdout)
#define Debug(_) freopen(#_".in", "r", stdin);freopen("debug.out", "w", stdout)
#define fo(i, a, b) for (int i = a; i <= b; ++i)
#define fd(i, a, b) for (int i = a; i >= b; --i)
#define N 10010
#define M 1010
#define mod 
#define inf 0x3f3f3f3f
#define db double
#define ll long long
#define gc getchar()
#define init(a, b) memset(a, b, sizeof a)
using namespace std;
int up[N], down[N], wall[N], top[N], floor[N];
int f[N][M][2];
int main()
{
	int n, m, k;
	scanf("%d%d%d", &n, &m, &k);
	fo (i, 0, n - 1)
	{
		scanf("%d%d", &up[i], &down[i]);
		top[i] = m + 1;
	}
	top[n] = m + 1;
	fo (i, 1, k)
	{
		scanf("%d", &wall[i]);
		scanf("%d %d", &floor[wall[i]], &top[wall[i]]);
	}
	init(f, 0x3f);
	fo (i, 0, m)
		f[0][i][1] = f[0][i][0] = 0;
	fo (i, 0, n - 1)
		fo (j, floor[i] + 1, top[i] - 1)
		{
			int nex = j - down[i];
			if (nex > floor[i + 1] && nex < top[i + 1])
				f[i + 1][nex][0] = min(f[i + 1][nex][0], min(f[i][j][0], f[i][j][1]));
			nex = min(m, j + up[i]);
			if (nex > floor[i + 1] && nex < top[i + 1])
				f[i + 1][nex][1] = min(f[i + 1][nex][1], min(f[i][j][0], f[i][j][1]) + 1);
			nex = min(m, j + up[i - 1]);
			if (nex > floor[i] && nex < top[i])
				f[i][nex][1] = min(f[i][nex][1], f[i][j][1] + 1);
			
		}
	int ans = inf;
	fo (i, 1, m)
		ans = min(ans, min(f[n][i][0], f[n][i][1]));
	if (ans != inf)
		printf("1\n%d", ans);
	else
	{
		sort(wall + 1, wall + k + 1);
		printf("0\n");
		fo (i, 1, k)
		{
			int ok = 0;
			fo (j, floor[wall[i]] + 1, top[wall[i]] - 1)
				if (f[wall[i]][j][0] != inf || f[wall[i]][j][1] != inf)
				{
					ok = 1;
					break;
				}
			if (!ok)
			{
				printf("%d", i - 1);
				break;
			}
		}
	}
	return 0;
}

我的思路可能有些不一样,主要就是用当前的点去转移这个点往下掉的点,跳一次的点,和跳到这个点之前再跳一次的点,结果WA75pts,不知道是思路错了还是代码错了,求大佬指出

2021/1/18 21:32
加载中...