题意:
给定边长为a的等边三角形,变成边长为b的等边三角形,询问最少要转变几步
思路:
在队友的提醒下。才知道倒着转变, 从 b-> a 最少需要几步。 这样的话。每次都会有一个最小边变成能变成的极大边 或者 a
先给自己的代码。。再给队友的简洁代码。。心酸
#include <iostream>
#include <stdio.h>
using namespace std;
int a[5];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=3;i++)
a[i]=m;
int sum=0;
int op,mid,ed;
int flag=1;
while(a[1]!=n||a[2]!=n||a[3]!=n)
{
if(a[1]>=a[2]&&a[1]>=a[3])
{
op=1;
if(a[2]>=a[3])
{
mid=2;
ed=3;
}
else
{
mid=3;
ed=2;
}
}
if(a[2]>=a[1]&&a[2]>=a[3])
{op=2;
if(a[1]>=a[3])
{
mid=1;
ed=3;
}
else
{
mid=3;
ed=1;
}
}
if(a[3]>=a[1]&&a[3]>=a[2])
{op=3;
if(a[2]>=a[1])
{
mid=2;
ed=1;
}
else
{
mid=1;
ed=2;
}
}
if(ed==1)
{
int tep=a[op]+a[mid]-1;
if(tep>=n)
a[ed]=n;
else
a[ed]=tep;
}
if(ed==2)
{
int tep=a[op]+a[mid]-1;
if(tep>=n)
a[ed]=n;
else
a[ed]=tep;
} if(ed==3)
{
int tep=a[op]+a[mid]-1;
if(tep>=n)
a[ed]=n;
else
a[ed]=tep;
}
sum++;
}
cout<<sum<<endl;
return 0;
}
队友的代码。
#include<iostream>
using namespace std;
void swap(int& a, int& b, int& c){
if (b>c) c^=b^=c^=b;
if (a>b) a^=b^=a^=b;
if (b>c) b^=c^=b^=c;
}
int main()
{
int a, b, c;
int n,k;
while(cin>>n>>k){
int ans = 0;
a = b = c = k;
while(1){
a = b+c-1>=n?n:b+c-1;
swap(a,b,c);
ans++;
if (a == b && b == c && c == n) break;
}
cout<<ans<<endl;
}
return 0;
}