码迷,mamicode.com
首页 > 其他好文 > 详细

J - Just Terraffic! Gym - 101177J

时间:2019-10-07 21:20:37      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:size   name   src   bit   fine   std   color   clu   最大   

技术图片

技术图片
#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

标签:size   name   src   bit   fine   std   color   clu   最大   

原文地址:https://www.cnblogs.com/zhangzhenjun/p/11632188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!