7-5 两个蛋糕 (15分)
今天是BoBo和CoCo的生日,他们俩都想买一个n层蛋糕。蛋糕每层大小都不一样,从上到下大小分别为1到n。他们住在同一条街上,从左到右连续有2n个糕点店,可以在那里购买蛋糕层。不幸的是,在每个糕点店只能购买一个特定尺寸的一层:在第i蛋糕店可以购买大小ai(1≤a{i}i≤n)的蛋糕层。由于不可能在蛋糕中间插入新的层,只能按照从最小到最大的顺序购买每个蛋糕层。也就是说,他们每个人都要先买1,然后是2,然后是3,依此类推至n。 最初,BoBo和CoCo位于第一个(最左边)的房子附近。输出他们购买两个蛋糕必须走的最小距离。任何两个相糕点店之间的距离恰好是1。
输入格式:
第一行输入一个正整数n (1≤n≤105),代表蛋糕的层数。接下来一行输入2n个正整数a1,a{2}2…,a2n(1≤a{i}i≤n),ai代表在第i个蛋糕店可以买到的蛋糕层的大小,注意在一个蛋糕店只能买一层。题目输入保证能够按照尺寸顺序买到n个蛋糕层。
输出格式:
输出他们购买两个蛋糕必须走的最小距离。一开始俩人都位于最左边的蛋糕店。
输入样例1:
3
1 1 2 2 3 3
输出样例1:
9
输入样例2:
2
2 1 1 2
输出样例2:
5
输入样例3:
4
4 1 3 2 2 3 1 4
输出样例3:
17
#include <stdio.h>
#include<math.h>
int main(int argc, char const *argv[])
{
long long i,j,k,n,m,sum=0;
scanf("%lld",&n);
int a[2][500010];
int b[100005];
//一个数组用来标记数字,另一个用来保存这个数字出现的地址
for(i=0;i<n*2;i++){
scanf("%lld",&k);
if(b[k]){
a[1][k]=i;
}
else{
a[0][k]=i;
b[k]=1;
}
}
for(i=1;i<=n;i++){
// 起点位置也算 ,地址相减取绝对值
sum+=abs(a[0][i]-a[0][i-1])+ abs(a[1][i]-a[1][i-1]);
}
printf("%lld",sum);
return 0;
}