题目链接: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;
}