传送门:http://codeforces.com/problemset/problem/712/C
题目大意:
给你两个数x和y,满足
x≤y
。
一开始初始化一个等边三角形,边长是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;
}