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;
}