【bzoj2072】 POI2004MOS dp+贪心

先跪一下PoPoQQQ大爷的题解。

http://blog.csdn.net/popoqqq/article/details/44154629

好像是前几年的题了,夏令营上还讲过。

我们考虑一共有两种方式:

1.最快的人把最慢的人送到,最快的人回来

2.最快的人和次快的人一起,最快的人回来,最慢的和次慢的一起,次快的回来

表示自己想不到呀!!!

然后f[i]表示剩下i个人的时候最短时间。


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 100010
#define inf 1000000000

using namespace std;

int a[maxn];
long long f[maxn];
int n;

int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	if (n<=2) {printf("%d\n",a[n]);return 0;}
	a[n+1]=inf;
	for (int i=n-1;i>=2;i--)
	{
		f[i]=min((long long)f[i+1]+a[1]+a[i+1],(long long)f[i+2]+a[1]+a[2]+a[i+2]+a[2]);
	}
	printf("%lld\n",f[2]+a[2]);
	return 0;
}


你可能感兴趣的:(【bzoj2072】 POI2004MOS dp+贪心)