Codeforces Round #370 (Div. 2) C

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

Note

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<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    int a,b,c;
    int pos;
    int cot=0;
    cin>>n>>m;
    a=m,b=m,c=m;
    while(a!=n||b!=n||c!=n)
    {
        if(a!=n)
        {
            int pos1;
            //cout<<"A"<<endl;
            for(int i=1; i<=n; i++)
            {
               // cout<<"B"<<endl;
               // cout<<a<<" "<<b<<" "<<c<<endl;
                if((a+i)+b>c&&(b+c)>(a+i)&&(a+i)+c>b&&(a+i)<=n)
                {
                    pos1=i;
                   // cot++;
                }
            }
            a=a+pos1;
            cot++;
           // cout<<a<<endl;
           // break;
         //  cout<<a<<" "<<b<<" "<<c<<endl;
        }
      //  cout<<a<<" "<<b<<" "<<c<<endl;
      //  break;
        if(b!=n)
        {
            int pos2;
            for(int i=1; i<=n; i++)
            {
               // cout<<"B"<<endl;
                if((b+i)+a>c&&(a+c)>(b+i)&&(b+i)+c>a&&(b+i)<=n)
                {
                   // b=b+i;
                    pos2=i;
                    //cot++;
                }
            }
            b=b+pos2;
            cot++;
          //  cout<<a<<" "<<b<<" "<<c<<endl;
        }
     //   cout<<a<<" "<<b<<" "<<c<<endl;
       // break;
        if(c!=n)
        {
            int pos3;
            for(int i=1; i<=n; i++)
            {
                if((c+i)+a>b&&b+(c+i)>a&&b+a>c+i&&(c+i)<=n)
                {
                   // cout<<i<<endl;
                    pos3=i;
                   // c=c+i;
                   // cot++;
                }

            }

            c=pos3+c;
            cot++;
         //   cout<<a<<" "<<b<<" "<<c<<endl;
        }
      //  break;
       // cout<<a<<" "<<b<<" "<<c<<endl;*/
    }
    cout<<cot<<endl;
    return 0;
}

  

时间: 2024-10-10 00:29:42

Codeforces Round #370 (Div. 2) C的相关文章

Codeforces Round #370(div 2)

A B C :=w= D:两个人得分互不影响很关键 一种是f[i][j]表示前i轮,分差为j的方案数 明显有f[i][j]=f[i-1][j-2k]+2*f[i-1][j-2k+1]+...+(2k+1)f[i-1][j]+... 枚举是K*T*T,转移是K 超时 不过发现转移的时候可以理解为j是j-1的算式的整个区间移动,于是可以维护f[i-1]的前缀和来达到O(1)的转移 另一种f[i][j]表示前i轮,某个人分数为j的方案数(两人互不影响,无先后手之分,所以两人等价) 式子写出来就少了第一

Codeforces Round #370 (Div. 2) D. Memory and Scores DP

D. Memory and Scores Memory and his friend Lexa are competing to get higher score in one popular computer game. Memory starts with score a and Lexa starts with score b. In a single turn, both Memory and Lexa get some integer in the range [ - k;k] (i.

Codeforces Round #370 (Div. 2) B

Description Memory is performing a walk on the two-dimensional plane, starting at the origin. He is given a string s with his directions for motion: An 'L' indicates he should move one unit left. An 'R' indicates he should move one unit right. A 'U'

Codeforces Round #370 - #379 (Div. 2)

题意: 思路: Codeforces Round #370 A - Memory and Crow 题意:有一个序列,然后对每一个进行ai?=?bi?-?bi?+?1?+?bi?+?2?-?bi?+?3.... 的操作,最后得到了a 序列,给定 a 序列,求原序列. 思路:水. 1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cstd

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd