7-5 两个蛋糕

7-5 两个蛋糕 (15分)

今天是BoBo和CoCo的生日,他们俩都想买一个n层蛋糕。蛋糕每层大小都不一样,从上到下大小分别为1到n。他们住在同一条街上,从左到右连续有2n个糕点店,可以在那里购买蛋糕层。不幸的是,在每个糕点店只能购买一个特定尺寸的一层:在第i蛋糕店可以购买大小a​i​​(1≤a{i}​i​​≤n)的蛋糕层。由于不可能在蛋糕中间插入新的层,只能按照从最小到最大的顺序购买每个蛋糕层。也就是说,他们每个人都要先买1,然后是2,然后是3,依此类推至n。 最初,BoBo和CoCo位于第一个(最左边)的房子附近。输出他们购买两个蛋糕必须走的最小距离。任何两个相糕点店之间的距离恰好是1。
输入格式:

第一行输入一个正整数n (1≤n≤10​5​​),代表蛋糕的层数。接下来一行输入2n个正整数a​1​​,a{2}​2​​…,a​2n​​(1≤a{i}​i​​≤n),a​i​​代表在第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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值