CodeForces 712 C. Memory and De-Evolution(贪心)

来源:互联网 发布:网络策略 sftp 协议 编辑:程序博客网 时间:2024/06/05 03:08

Description
将一个边长为x的等边三角形经过最少的操作步变成边长为y的等边三角形,每次操作可以减去任一边的任意长度,但是要保证这三条边还能构成一个三角形
Input
两个整数x和y表示已有的等边三角形边长和要得到的等边三角形边长(3<=y < x<=100000)
Output
输出最少操作步数
Sample Input
6 3
Sample Output
4
Solution
逆推,三条边初始都是y,每次变边长最短的那条边长度变为min(n,较长两条边长度之和-1),这样每一步增加的长度最大,就可以在保证合法的情况下在最少的步数之内变成三条长度为x的边
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 1111int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        int a[3],cnt=0;        a[0]=a[1]=a[2]=m;        while(!(a[0]==n&&a[1]==n&&a[2]==n))        {            cnt++;            a[0]=a[1],a[1]=a[2];            a[2]=min(n,a[0]+a[1]-1);        }        printf("%d\n",cnt);    }    return 0;}
0 0