蓝桥杯练习

文章介绍了如何用递归和动态数组解决飞机降落问题,探讨了如何在有限跑道条件下合理安排降落顺序,确保所有飞机安全降落。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用递归写全排列

#include <iostream>

using namespace std;

int n;

int aa[3]={1,2,3};

int bb[3];

int s[3]={0};

void dfs(int a)

{

    if(a==3)

    {

        for(int i=0;i<3;i++)

        {

            cout<<bb[i];

        }

        cout<<endl;

        return;

    }

    else

    {

        for(int i=0;i<3;i++)

        {

            if(!s[i])

            {

                bb[a]=aa[i];

                s[i]=1;

                dfs(a+1);

                s[i]=0;

            }

        }

    }

}

int main()

{

  dfs(0);

    return 0;

}

神奇的递归,循环解决不了啊。

试题D:飞机降落

【问题描述】

N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻

到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早

可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。降落过程需要 Li

个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不

能在前一架飞机完成降落前开始降落。

请你判断 N 架飞机是否可以全部安全降落。

【输入格式】

输入包含多组数据。

第一行包含一个整数 T,代表测试数据的组数。

对于每组数据,第一行包含一个整数 N。

以下 N 行,每行包含三个整数:Ti,Di 和 Li。

【输出格式】

对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。

【样例输入】

2

3

0 100 10

10 10 10

0 2 20

3

0 10 20

10 10 20

20 10 20

【样例输出】

YES

NO

【样例说明】

对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降

落。安排第 2 架飞机于 20 时刻开始降落,30 时刻完成降落。安排第 1 架飞机

于 30 时刻开始降落,40 时刻完成降落。

对于第二组数据,无论如何安排,都会有飞机不能及时降落。

【评测用例规模与约定】

对于 30% 的数据,N ≤ 2。

对于 100% 的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 10,0 ≤ Ti, Di, Li ≤ 10

这个题由于基数不大,我们直接全排列分别试一试。

#include <iostream>

using namespace std;

int m=5;

int* bb = new int[m];

int* s = new int[m];

int* t = new int[m];

int* d = new int[m];

int* l = new int[m];

int flag;

void dfs(int a)

{

    if(a==m)

    { int flag1=0;

    int time=0;

        for(int i=0;i<m-1;i++)

        {

            if(time<t[bb[i]])

            {

                time=t[bb[i]]+l[bb[i]];

            }

            else

            {

                time=time+l[bb[i]];

            }

            if(time>t[bb[i+1]]+d[bb[i+1]])

                {

                    flag1=1;

                    break;

                }

        }

        if(!flag1)

        {

            flag=1;

        }

        return;

    }

    else

    {

        for(int i=0;i<m;i++)

        {

            if(!s[i])

            {

                bb[a]=i;

                s[i]=1;

                dfs(a+1);

                s[i]=0;

            }

        }

    }

}

int main()

{

    int n;

    cin>>n;

    for(int i=0;i<n;i++)

    {

        cin>>m;

        flag=0;

        for(int j=0;j<m;j++)

        {

            cin>>t[j]>>d[j]>>l[j];

        }

        for(int i=0;i<m;i++)

{

    s[i]=0;

}

  dfs(0);

  if(flag==1)

  {

      cout<<"yes"<<endl;

  }

  else

    cout<<"no"<<endl;

    }

    return 0;

}

除了思路之外,还有全局变量的设置和动态数组的建立是难点。包括时间的计算等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值