J - Just Terraffic! Gym - 101177J
Posted zhangzhenjun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了J - Just Terraffic! Gym - 101177J相关的知识,希望对你有一定的参考价值。
#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);
以上是关于J - Just Terraffic! Gym - 101177J的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces Gym 100685J Just Another Disney Problem (STL,排序)
gym101532 2017 JUST Programming Contest 4.0