CF 712C. Memory and De-Evolution 贪心

题目


题意:

给出一个正三角形要求变为另一个边长较小的正三角形。
要求变化过程中,每一步改变一条边长度,并且使之变为边为整数的三角形。问最小步数。


解法:

当初直观认为,每个只需要将最长的边,变得尽量短即可,结果样例都过不了。因为如果变得太短比如(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值