![]()
![]()
#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\n");
return 0;
}
if (visit[n] == 1)
{
printf("Ambiguous\n");
return 0;
}
printf("Cars without trailers: %d\n", dp[n]);
printf("Cars with trailers: %d\n", (n - 2 * dp[n]) / 3);
}