Gym - 101490D-思维&好题&思考&递推-Bridge Automation

https://vjudge.net/problem/Gym-101490D
一群船要过一个桥(类似鸭绿江断桥那种桥,过船的时候需要把桥断开。)
给你每个时刻他们到达的时间,每条船最多等待30分钟(1800秒)。
桥开启,和关闭都需要60秒。 过船需要20秒。
问你如何使桥合理的开关,让影响交通的时间最少。
可以理解为一种动态规划。
1 枚举的船和 当前i船一起走。
共三种情况。
① 有一只船等着受不鸟了,必须提前开门()。
② 大家都能等,所以直接等到最后走吧(这样节省自然资源。)
③ 有一只船能等,但是如果让他等够。他后面的船还要走啊。这样花费了太多的时间。
还不如让i船自己走呢 (¬︿̫̿¬☆),所以取一个max

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5;
/* 又是dp,但是大概是递推把。
   没有怎么看懂 那个dp数组。
   每次找最大??。
   后来我才发现了,总共有三种情况。
*/
int dp[maxn];//
int a[maxn];
int m;
int main()
{   while(~scanf("%d",&m)){
          for(int i=1;i<=m;i++){
              scanf("%d",&a[i]);
          }
          memset(dp,0,sizeof(dp));
          int tim;
          for(int i=1;i<=m;i++){
              int tim=dp[i-1]+140;//让i哥享受vip,开门关门走。
                 for(int j=1;j<i;j++){
                 if(a[i]-a[j]<1780)//i船可以等。都等到一起再走
                      tim=min(tim,(i-j+1)*20+120+dp[j-1]);
                  else if(a[i]-a[j]>=1780)//j哥等不及。给j哥开了。 如果让j哥时间多,就得让。如果时间少,就说明等到一起就能等到j船。120最后加,是开关时间。
                     tim=min(tim,dp[j-1]+max(a[i]-a[j]-1780,(i-j+1)*20)+120);
                }
                dp[i]=tim;
          }
          printf("%d\n",dp[m]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值