题目链接:https://ac.nowcoder.com/acm/contest/331/D
题目大意:


思路:每个传送阵可以选择传送或者不传送。
从n->1开始考虑。从终点最远的传送阵开始枚举

#include<bits/stdc++.h>
using namespace std;
#define LL long long
struct NODE
{
    int x, y;
}node[16];

int cmp(NODE a, NODE b)
{
    return a.y>b.y;
}

LL T(LL l, LL r)     //从l到r不经过传送阵的最少时间
{
    LL s=r-l;
    if(s==0)
    {
        return 0;
    }
    if(s==1)
    {
        return 1;
    }
    LL c=(LL)log2(s);
    c=r-pow(2, c);
    return  T(l, c)+1;

}

LL dfs(int n, int cut)
{
    if(cut==0)
    {
        return T(1, n);
    }
    else if(n>=node[cut].y)  //如果当前位置>传送阵的终点:选择传送或者不传送的最少时间的方案
    {
        return min(dfs(n, cut-1),dfs(node[cut].x, cut-1)+T(node[cut].y, n)+1);
    }
    else
    {
        return dfs(n, cut-1);//如果当前位置<传送阵的终点:只能选择不传送
    }
}

int main()
{
    LL n;
    int k, cut=1, u, v;
    scanf("%lld%d",&n,&k);
    for(int i=1;i<=k;i++)
    {
        scanf("%d%d",&u,&v);
        if(u!=v)
        {
            node[cut].x=u;
            node[cut++].y=v;
        }
    }
    sort(node+1, node+cut+1, cmp); //从终点最大的传送阵开始选择
    cout<<dfs(n, cut-1)<<endl;     //从n->1

	return 0;
}