#include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; /* 一道dp题,看来自己还是需要继续努力呀 dp[i]表示的是1-i个时间,所能够完美表示的2轮的车有多少个 状态转移 满足条件 dp[i]=dp[i-2]+1 dp[i]=dp[i-3] 并且如果dp[i-2]+1!=dp[3],说明有多种情况,虽然能够分好 */ int a[350000]; int dp[350000]; int visit[350000]; int main() { int n, i; scanf("%d", &n); memset(dp, -1, sizeof(dp)); memset(visit, 0, sizeof(visit)); for (i = 1; i <= n; i++) scanf("%d", &a[i]); a[0] = -inf; dp[0] = 0; a[n + 1] = 2 * inf; for (i = 1; i <= n; i++) { if (i >= 2 && dp[i - 2] >=0 && (a[i] - a[i - 1] < 2000) && (a[i - 1] - a[i - 2] > 1000) && a[i + 1] - a[i] > 1000) { visit[i] = visit[i - 2]; dp[i] = dp[i - 2] + 1; } if (i >= 3 && dp[i - 3] >=0 && (a[i] - a[i - 1] < 2000 && a[i - 1] - a[i - 2] < 2000) && (a[i - 2] - a[i - 3] > 1000) && a[i + 1] - a[i] > 1000) { if (dp[i] > 0) { if (dp[i] != dp[i - 3]) visit[i] = 1; else visit[i]=max(visit[i],visit[i-3]); //为什么要选择最大的,是因为这两种情况都可以 //虽然结果一样,但是,如果出现一个有问题,那么你在分的时候就出现 //多种情况,你却不知道如何弄 } else { dp[i] = dp[i - 3]; visit[i] = visit[i - 3]; } } } if (dp[n] == -1) { printf("Impossible "); return 0; } if (visit[n] == 1) { printf("Ambiguous "); return 0; } printf("Cars without trailers: %d ", dp[n]); printf("Cars with trailers: %d ", (n - 2 * dp[n]) / 3); }