此题DP。用一个前缀和一样的东西,把载i个奶牛的时间求出来,然后DP代码如下:
for(int i=1;i<=n;++i){ f[i]=que[i]; for(int j=0;j<i;++j) f[i]=min(f[i],f[j]+que[i-j]); }
这句话的意思是说,先载i头奶牛,然后从载0头到载i-1头寻找,看有没有更优解。如果有,那么更新。
最后输出的时候输出DP[n]-m,因为最后FJ是不用再回对岸的
放上代码
#include<cstdio> #include<cstdlib> #include<cctype> using namespace std; inline long long min(long long a,long long b){ return a<b?a:b; } inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=(num<<1)+(num<<3)+ch-'0'; ch=getchar(); } return num*f; } int que[1000000]; int f[1000000]; int main(){ int n=read(),m=read(); que[0]=m<<1; for(int i=1;i<=n;++i) que[i]=que[i-1]+read(); for(int i=1;i<=n;++i){ f[i]=que[i]; for(int j=0;j<i;++j) f[i]=min(f[i],f[j]+que[i-j]); } printf("%d",f[n]-m); return 0; }