题目
题意:
给出一个正三角形要求变为另一个边长较小的正三角形。
要求变化过程中,每一步改变一条边长度,并且使之变为边为整数的三角形。问最小步数。
解法:
当初直观认为,每个只需要将最长的边,变得尽量短即可,结果样例都过不了。因为如果变得太短比如(22,22,22)->(22,22,1) 下一步变化的效果就很差
逆向考虑,给定终边,倒推,每次使最小边尽可能变大。
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
int S,E,a[3];
void solve()
{
int ans=0;
while( a[0]!=S||a[1]!=S||a[2]!=S )
{
int sum=a[0]+a[1]+a[2];
int p=a[0]<=a[1]?0:1;
if(a[2]<=a[p]) p=2;
a[p]=min(sum-a[p]-1,S);
ans++;
}
cout<<ans<<endl;
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>S>>E)
{
a[0]=a[1]=a[2]=E;
solve();
}
return 0;
}