逮虾户(递归)


前言

第6次发csdn,心情还是有些许的激动


逮虾户

你现在开车在一条狭长的直道上,你想用 t 秒的时间,恰好行驶 d 米的距离。

最开始车是静止不动的,也就是说车速是 0 (m/s)

在每个整数秒的时间点上( 包括最开始的 0 时刻),你可以选择任意一个非负整数 x ,然后把车速瞬间增加 x (m/s),这样会消耗你 x2 单位的油 。 每个整数秒的时间点上 ,你只能选择一次 。

问你最少需要多少单位的油 。

Input

输入只有一行,包括两个正整数 t 和 d

Output

输出一行,包含一个整数,代表答案

Example

1、
input:4 10 output : 4
2、
input:5 33 output : 21
3、
input:1 30000 output : 900000000

设计递归函数

通过 递归函数 遍历每一种情况,然后得出最少用油量
即尝试各种加速情况,将符合要求的情况中的用油量作比较,最终输出最少用油量
*以下为部分代码,文章最后将给出完整程序


void run(int t,int s,int v,int oil,int &minOil){
    if(t==0) goto part1;
    int aMax;
    aMax=s/t;
    t--;
    int nv,ns,no;

    for (int i=0;i<=aMax;i++){
        nv=v+i;
        ns=s;
        no=oil;
        if((ns-nv)>=0){
            no=oil+(i*i);
            ns-=nv;
            run(t,ns,nv,no,minOil);

        }

    }
    part1:
    if(t==0 && s==0) {
        if (minOil>oil) minOil=oil;
    }
}

完整代码

#include <iostream>
#include <cmath>
using namespace std;

void run(int t,int s,int v,int oil,int &minOil){
    if(t==0) goto part1;
    int aMax;
    aMax=s/t;
    t--;
    int nv,ns,no;

    for (int i=0;i<=aMax;i++){
        nv=v+i;
        ns=s;
        no=oil;
        if((ns-nv)>=0){
            no=oil+(i*i);
            ns-=nv;
            run(t,ns,nv,no,minOil);

        }

    }
    part1:
    if(t==0 && s==0) {
        if (minOil>oil) minOil=oil;
    }
}

int main()
{
    int minOil,t,s,a;
    cin>>t>>s;
    a=(s/t);
    minOil=pow(a,2);
    run(t,s,0,0,minOil);
    cout<<minOil<<endl;
    return 0;
}

以上为全部内容,祝你在学习道路上如履平地 ^_*

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值