CodeForces 712C Memory and De-Evolution(逆推,新思路)

传送门:http://codeforces.com/problemset/problem/712/C

题目大意:
给你两个数x和y,满足 xy
一开始初始化一个等边三角形,边长是x,每次改变一条边,但每次改变之后都要保证三条边能围成三角形,问改成边长为y的等边三角形至少需要几次?

题目分析:
刚开始如果从正面去思考,是很难的,因为题目给出的样例里,22改为4,第一次变化为(22,22,22)-(7,22,22),这个7是怎么出来就很难把握,如果直接变成4的话,那(4,22,22)的第二条边就不能直接变成4,而需要中间状态。那么这个中间值又如何算就很困难。

所以可以倒着推,先从边长为y的三角形出发,每次把最小的一条边变成另外两条边之和-1,如果该值超过x则变为x,这样可以保证从反向过来是贪心的,那么也就是最优解了。

刷题就是一个积累套路的过程。
而本题的思路我以前从来没见过,因此要重点学习“逆向思维”的思想。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    int x,y;
    scanf("%d %d",&x,&y);
    vector<int> p;
    p.push_back(y);p.push_back(y);p.push_back(y);
    int cnt=0;
    while(p[0]!=x || p[1]!=x || p[2]!=x) {
        sort(p.begin(),p.end());
        p[0]=min(p[1]+p[2]-1,x);
        cnt++;
        //cout<<p[0]<<' '<<p[1]<<' '<<p[2]<<endl;//debug
    }
    cout<<cnt<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值