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

来源:互联网 发布:餐饮软件全国排名 编辑:程序博客网 时间:2024/06/06 19:27

传送门: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;}
0 0
原创粉丝点击