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