#include<bits/stdc++.h>
using namespace std;
const int MAXN = 4e3+10;
int b[MAXN];
long long dp[MAXN];//通过第n艘船的后关上桥花费最少
int t[MAXN];
int main()
{
if (fopen("test.txt", "r") != NULL)
{
freopen("test.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
}
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",b+i);
}
dp[0]=0;
for(int i=1;i<=n;i++)
{
dp[i]=1e18;
for(int j=1;j<=i;j++)//枚举一起通过了多少艘船,首先可以确定的是这艘船肯定是由之前某一次的船通过后关上桥再打开桥的状态转移过来的,通过枚举来找
dp[i]=min(dp[i],dp[i-j]+max(b[i]+20-b[i-j+1]-1800,20*j)+120);//max(b[i]+20-b[i-j+1]-1800,20*j)这个的意思是可能是船i-j+1到船i的时间相隔较远,那么就要桥一直开着,这些船通过的总时间就变成了b[i]+20-b[i-j+1],可以除去i-j+1号船的忍耐时间。
//或者船i-j+1到船i的时间相隔近,那么通过的时间最多也就20*j,最后加上开关门时间
//这道题这有一个很重要的话Boats are sorted by increasing time of arrival, and never arrive within 20 seconds of each other (i < j implies Ti + 20 ≤Tj).这句话有什么作用?也就是说每艘船一定可以在他时间点后20s后通过,不会说因为队伍太长船太多。
}
cout<<dp[n]<<endl;
return 0;
}
Gym - 101490D
最新推荐文章于 2019-11-19 21:53:21 发布