FOJ1492 地震预测

http://acm.fzu.edu.cn/problem.php?pid=1492
TLE了很多,以前向别人要了代码看不懂,今晚重做,一次AC。主要思想是记录排序后相邻的元素并及时更新。

#include<iostream>
#include
<cmath>
#include
<algorithm>
using namespace std;

struct Node
{
    
int pos,val;
    
bool operator<(const Node &a) const
    
{
        
return val<a.val;
    }

}
node[100001];
int pos[100001],alloc[100001][2];//pos 原来元素(1-n)在排序后的位置,alloc排序后相邻元素在原序列的位置

inline 
int min(int a,int b)
{
    
return a>? b : a;
}


int main()
{
    
int i,n,res,t1,t2;
    
while(scanf("%d",&n)!=EOF)
    
{
        
for(i=1;i<=n;i++)
        
{
            scanf(
"%d",&node[i].val);
            node[i].pos
=i;
        }

        sort(node
+1,node+n+1);
        node[
0].pos=0,node[0].val=100000000;
        node[n
+1].pos=n+1,node[n+1].val=100000000;
        pos[
0]=0,pos[n+1]=n+1;
        
for(i=1;i<=n;i++)
        
{
            pos[node[i].pos]
=i;
            alloc[node[i].pos][
0]=node[i-1].pos;
            alloc[node[i].pos][
1]=node[i+1].pos;
        }

        res
=node[pos[n]].val;
        
for(i=1;i<n;i++)
        
{
            t1
=abs(node[pos[i]].val-node[pos[alloc[i][0]]].val);
            t2
=abs(node[pos[i]].val-node[pos[alloc[i][1]]].val);
            res
+=min(t1,t2);
            alloc[alloc[i][
0]][1]=alloc[i][1];
            alloc[alloc[i][
1]][0]=alloc[i][0];
        }

        printf(
"%d\n",res);
    }

    
return 0;
}

posted on 2010-05-09 01:07 CisJiong 阅读(337) 评论(0)  编辑 收藏 引用 所属分类: FOJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

常用链接

留言簿(2)

随笔分类(16)

随笔档案(11)

最新随笔

最新评论