Description
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?
Input
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.
Output
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.
Examples
input
6 3
output
4
input
8 5
output
3
input
22 4
output
6
题目大意
将边长为x的正三角形减少为边长为y的正三角形,每一步只能改变一条边,问最小需要多少次操作。
解题思路
逆向思维。
根据贪心策略,我们的想法是每一步变化的越大越靠近目标值越好,可是当正向考虑时根据第三组样例数据我们会发现每一步减少的值无法控制。当用逆向思维去将正三角形的边由y增大为x,根据三角形任意两边之和小于第三边,可以每一步都将第三边修改为最大的两条边的和-1,直至最小边的值>=x.
代码实现
#include<bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false);\
cin.tie(0);\
cout.tie(0);
typedef long long ll;
int num[1<<18];
char str[20];
int main()
{
IO;
int x,y;
cin>>x>>y;
int a,b,c,ans=0;
a=b=c=y;
while(a<x)
{
swap(a,b);
swap(b,c);
c=a+b-1;
ans++;
// cout<<a<<" "<<b<<" "<<c<<endl;
}
cout<<ans<<endl;
return 0;
}