比赛 20091026 评测结果 C
题目名称 抢修道路 最终得分 0
用户昵称 TBK 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-10-26 21:40:02
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;      
int a[2001][3]={0},b[2001][3]={0},c,d,l,m,n,s1=0,s2=0,t,x,y,z;
bool bo1[2001]={false},bo2[2001]={false};
int main(void)      
{         
    freopen("roady.in","r",stdin);      
    freopen("roady.out","w",stdout);       
    scanf("%d",&n);   
    for (c=0;c<n;c++) 
	{
		scanf("%d",&a[c][0]);
		b[c][0]=a[c][0];
	}
	for (d=0;d<n;d++) a[d][1]=-1;
	for (d=1;d<n;d++)   
		for (l=d-1;l>=0;l--)   
			if ((a[d][0]>=a[l][0])&&(a[l][2]>=a[d][2]))
			{
				a[d][1]=l;
				a[d][2]=a[l][2]+1;
			}
	x=0;
	for (d=0;d<n;d++) 
		if (a[d][2]>x) x=a[d][2];
	for (d=0;d<n;d++) b[d][1]=-1;
	for (d=1;d<n;d++)   
		for (l=d-1;l>=0;l--)   
			if ((b[d][0]<=b[l][0])&&(b[l][2]>=b[d][2])) 
			{
				b[d][1]=l; 
				b[d][2]=b[l][2]+1;
			}
	y=0;
	for (d=0;d<n;d++)
		if (b[d][2]>y) y=b[d][2];
	for (d=0;d<n;d++)
		if (a[d][2]==x) break;
	t=a[d][1];
	bo1[d]=true;
	while (t!=-1)
	{
		bo1[t]=true;
		t=a[t][1];
	}
	for (d=0;d<n;d++)
		if (bo1[d]==false)
		{
			if ((d!=0)&&(d!=n-1)) 
			{
				if (abs(a[d][0]-a[d-1][0])>abs(a[d][0]-a[d+1][0])) s1+=abs(a[d][0]-a[d+1][0]);
					else s1+=abs(a[d][0]-a[d-1][0]);
			}
				else if (d==0) s1+=abs(a[0][0]-a[1][0]);
						else s1+=abs(a[n-2][0]-a[n-1][0]);
		}
	for (d=0;d<n;d++)
		if (b[d][2]==x) break;
	t=b[d][1];
	bo2[d]=true;
	while (t!=-1)
	{
		bo2[t]=true;
		t=b[t][1];
	}	
	for (d=0;d<n;d++)
		if (bo2[d]==false)
		{
			if ((d!=0)&&(d!=n-1)) 
			{
				if (abs(b[d][0]-b[d-1][0])>abs(b[d][0]-b[d+1][0])) s2+=abs(b[d][0]-b[d+1][0]);
					else s2+=abs(b[d][0]-b[d-1][0]);
			}
				else if (d==0) s2+=abs(b[0][0]-b[1][0]);
					else s2+=abs(b[n-2][0]-b[n-1][0]);
		}
	if (s1<s2) printf("%d\n",s1);
		else printf("%d\n",s2);
    fclose(stdin);
	fclose(stdout);
    return 0;      
}