Memory is now interested in the de-evolution of objects, specifically triangles. He starts with an equilateral triangle of side length x, and he wishes to perform operations to obtain an equilateral triangle of side length y.
In a single second, he can modify the length of a single side of the current triangle such that it remains a non-degenerate triangle (triangle of positive area). At any moment of time, the length of each side should be integer.
What is the minimum number of seconds required for Memory to obtain the equilateral triangle of side length y?
The first and only line contains two integers x and y (3 ≤ y < x ≤ 100 000) — the starting and ending equilateral triangle side lengths respectively.
Print a single integer — the minimum number of seconds required for Memory to obtain the equilateral triangle of side length y if he starts with the equilateral triangle of side length x.
6 3
4
8 5
3
22 4
6
In the first sample test, Memory starts with an equilateral triangle of side length 6 and
wants one of side length 3. Denote a triangle with sides a, b,
and c as (a, b, c).
Then, Memory can do .
In the second sample test, Memory can do .
In the third sample test, Memory can do:
.
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int ST, ED;
int a[3];
int main()
{
while (~scanf("%d%d", &ED, &ST))
{
a[0] = a[1] = a[2] = ST;
int step = 0;
while (a[0] != ED)
{
gmax(a[0], min(ED, a[1] + a[2] - 1));
++step;
sort(a, a + 3);
}
printf("%d\n", step);
}
return 0;
}
/*
【题意】
初始有一个边长为ED的等边三角形,
我们每次可以选取其中任意一点边,使其变短(但是该三角形一定是合法三角形)
问你使得该三角形变为边长为反过来ST的等边三角形的最小操作数
(ED>ST)
【类型】
正难则反 贪心
【分析】
我们不如反过来考虑。
从边长为ST的等边三角形出发,目标是变为边长为ED的等边三角形。
我们做贪心增长即可。
复杂度是log级别
*/