本文主要是介绍【洛谷fromSSL_2020.10.29】捡石头,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
捡石头
解题思路
贪心。我们存储每一个编号的两个节点的位置,求相邻两个编号的两个节点分别的差。有两种情况,我们取 min \min min 即可,即:
a n s + = m i n ( a b s ( a [ i ] [ 1 ] − a [ i + 1 ] [ 1 ] ) + a b s ( a [ i ] [ 2 ] − a [ i + 1 ] [ 2 ] ) , a b s ( a [ i ] [ 1 ] − a [ i + 1 ] [ 2 ] ) + a b s ( a [ i ] [ 2 ] − a [ i + 1 ] [ 1 ] ) ) ; ans+=min(abs(a[i][1]-a[i+1][1])+abs(a[i][2]-a[i+1][2]),abs(a[i][1]-a[i+1][2])+abs(a[i][2]-a[i+1][1])); ans+=min(abs(a[i][1]−a[i+1][1])+abs(a[i][2]−a[i+1][2]),abs(a[i][1]−a[i+1][2])+abs(a[i][2]−a[i+1][1]));
code
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;ll n;
ll t,ans;
ll a[200010][3];int main()
{cin>>n;for(int i=1;i<=2*n;i++){scanf("%d",&t);if(a[t][1]==0)a[t][1]=i;elsea[t][2]=i;}ans=a[1][1]+a[1][2]-2;for(int i=1;i<n;i++)ans+=min(abs(a[i][1]-a[i+1][1])+abs(a[i][2]-a[i+1][2]),abs(a[i][1]-a[i+1][2])+abs(a[i][2]-a[i+1][1]));cout<<ans<<endl;
}
这篇关于【洛谷fromSSL_2020.10.29】捡石头的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!